새소식

반응형
Java/Spring

Spring Boot 게시판 만들기-3(DataBase 연결, MariaDB) 방법 2

  • -
반응형

1. DataBase 연결을 위한 pom.xml(Project Object Model)에 dependency 추가

* pom.xml에 dependency를 추가하기 전에 JDBCMyBatis를 확인한다.

*JDBC

: JDBC(Java DataBase Connectivity)란 자바에서 DB 프로그래밍을 위해 사용되는 API

: DB와 관련된 일을 처리하며, DB 종류에는 상관없다.

필요 구성요소

- JDBC Driver

: DBMS와 통신을 담당하는 자바 클래스

: 각 DB에 맞는 드라이버가 필요하다.

- JDBC URL

: DBMS와 연결을 위한 식별자

: DBMS 드라이버 마다 식별자가 다르다.

: 구성- jdbc:[DMBC]:데이터베이스 식별자

ex) MySQL : jdbc:mysql://ip:port/DataBase명

- DB UserName, Password 등

* MyBatis

: 객체지향언어인 자바의 관계형 데이터베이스 프로그래밍을 보다 쉽게 도와주는 프레임워크

: JDBC보다 더 편리하게 데이터베이스 프로그래밍을 할수 있다.

- 특징

1. SQL문이 코드로부터 완전히 분리 : 기존에는 DAO파일에 모든 SQL문을 작성하였지만,

MyBatis는 Mapper 파일에 SQL문을 적어놓고 필요할때마다 DAO 파일에서 가져와서 사용

2. 생산성 : 코드가 짧다

3. 유지보수성 향상 : 프로그램 코드와 SQL문의 분리로 인한 코드의 간결성 및 유지보수성 향상

- 본론으로 들어가 이제 dependency를 추가하자

 

<!--JDBC(Java DataBase Connectivity) -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jdbc</artifactId>

<version>1.4.1.RELEASE</version>

</dependency>

<!-- MySQL -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.6</version>

</dependency>

<!--MyBatis -->

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.1.1</version>

</dependency>

<!-- commons-dbcp -->

<dependency>

<groupId>commons-dbcp</groupId>

<artifactId>commons-dbcp</artifactId>

<version>1.4</version>

</dependency>

* commons-dbcp(DataBase Connection Pool) 라이브러리

: 요청이 올때마다 DB Connection 객체를 얻는것이 아닌, 미리 일정 갯수의 DB Connection 객체를 생성하여 Connection Pool에서 관리하는것이다.

만약 Connection Pool을 사용하지 않을경우

1. DB 서버 접속을 위해 JDBC 드라이버를 로드한다.

2. DB 접속 정보와 DriverManager.getConnection() Method를 통해 DB Connection 객체를 얻는다.

3. Connection 객체로 부터 쿼리를 수행하기 위한 PreparedStatement 객체를 받는다.

4. executeQuery를 수행하여 그 결과로 ResultSet 객체를 받아서 데이터를 처리한다.

5. 처리가완료되면 처리에 사용된 리소스들을 close하여 반환한다.

DBCP를 사용한다면

1. WAS가 실행되면서 미리 일정량의 DB Connection 객체를생성하고 Pool이라는 공간에 저장해 둔다.

2. HTTP 요청에 따라 필요할 때 Pool에서 Connection 객체를 가져다 사용하고 반환한다.

이와같은 방식으로 DBCP을 사용하게 되면 DB 드라이버를 로드하여 Conneciton 객체를 생성하고 반환하는 시간이 줄어들기 때문에 효율적으로 DB query를 할수 있다.

dependendcy를 추가하고 라이브러리들을 update 하기 위해 Maven > Update Project 적용

2. DB 연결정보 설정을 위한 database.properties 생성

- /src/main/resources > database.properties 생성

1. /src/main/resources 에 마우스 오른쪽 클릭 후 new > Other 선택

2. General > File 선택

3. database.properties 파일명 입력 후 Finish

3. DB 연결정보 설정을 위한 database.properties에 설정정보 추가

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/DB명

jdbc.username=유저명

jdbc.password=패스워드

4. DB 연결정보 설정

1. DB 연결정보를 설정하기 위한 Config 클래스 생성

2. DB 연결정보 설정

- 소스코드

package com.example.demo.config;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.mybatis.spring.SqlSessionTemplate;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

import org.springframework.core.env.Environment;

@Configuration

@PropertySource("classpath:database.properties")

@MapperScan("com.example.demo.mapper")

public class DBConfig {

@Autowired

Environment env;

@Bean

public DataSource dataSource() {

BasicDataSource dataSource = new BasicDataSource();

dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));

dataSource.setUrl(env.getProperty("jdbc.url"));

dataSource.setUsername(env.getProperty("jdbc.username"));

dataSource.setPassword(env.getProperty("jdbc.password"));

return dataSource;

}

@Bean

public SqlSessionFactory sqlSessionFactory() throws Exception {

SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

sqlSessionFactoryBean.setDataSource(this.dataSource());

return sqlSessionFactoryBean.getObject();

}

@Bean

public SqlSession sqlSession() throws Exception {

SqlSession sqlSession = new SqlSessionTemplate(this.sqlSessionFactory());

return sqlSession;

}

}


* @Configuation

: Spring IOC 컨테이너(Spring의 핵심인 Beans를 관리하는 컨테이너)에게 해당 어노테이션이 있는곳은 Bean 구성 클래스임을 명시하여 Bean으로 등록하기 위함

* @Bean@Component 어노테이션

: @Bean 과 @component 어노테이션 둘다 Spring(IOC) Container에게 Bean으로

등록하도록 하는 어노테이션이다.

하지만 둘의 차이점이 있다.

@Bean : 개발자가 직접 제어 불가능한 외부 라이브러리등을 Bean으로 생성할때 사용하는 어노테이션

@Component : 개발자가 직접 작성한 class를 Bean으로 등록하기 위한 어노테이션

* SqlSession, SqlSessionFactory, SqlSessionFactoryBuilder, SqlSessionFactoryBean, DataSource

SqlSession : 실질적인 SQL문을 실행, 트랜잭션 제어

SqlSessionFactory : SqlSesstion 객체를 생성하기 위한 구성요소

SqlSessionFactoryBuilder : MyBatis의 구성파일을 읽어 SqlSessionFactory를 생성하는 Builder

SqlSessionFactoryBean : MyBatis 구성파일을 생성하지 않고 SqlSessionFactoryBuilder가

SqlSessionFactoy를 생성할수 있게 도와준다.


5. 요청을 받는 Controller, 비즈니스 로직을 처리하는 Service, SQL문을 가지고 있는 Mapper 추가

- Controller.java

@Controller

public class SpringTestController {

@Autowired

SpringTestService ss;

@RequestMapping(value="/test")

public String springTestController(Model model) {

model.addAttribute("count", ss.springTestCountService());

return "test";

}

}

Model을 사용하여 view에서 보여질 데이터를 model 객체에 담는다.

- Service.java

@Service

public class SpringTestService {

@Autowired

SpringTestMapper sm;

public int springTestCountService() {

return sm.test();

}

}

- Mapper.interface

public interface SpringTestMapper {

final String TEST="SELECT count(*) FROM app_target";

@Select(TEST)

int test();

}

어노테이션만으로 쿼리를 실행 시킬수 있는 기능인 @Select 어노테이션이다.

간단하게 DB에 접근 할수 있고 동적쿼리가 아니라면 @Select 어노테이션을 사용하면 좋다.

@Select 어노테이션 말고도 @Insert, @Update, @Delete가 있다.

6. 화면을 보여주는 view인 jsp 파일 추가

- Controller에서 추가한 model 객체의 attributeName과 같은 이름으로 jsp에 추가한다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

화면테스트입니다.

count : ${count}

</body>

</html>

7. 화면 확인

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.