병갈이 블록

코드로배우는 - mybatis 연결 본문

IT(Old)/Spring 공부 기록

코드로배우는 - mybatis 연결

woojang 2017. 7. 29. 22:14

오늘의 정리.

*** 스프링과 MyBatisMySQL의 연결 ***

1. 빈 등록에 필요한 모듈 다운로드 (mybatis, mybatis-spring, spring-jdbc, spring-test 아래에 설명)

2. root-context.xml에 관련 정보들 설정 및 등록.

3. Test메서드 작성 후 테스트.


** 자세히 ** 

1. 빈 등록에 필요한 모듈들.

- spring-jdbc

DataSource를 구현한 AbstractDataSource(org.springframework.jdbc.datasource에 위치)를 상속하는

DriverManagerDataSource 클래스를 DataSource객체로 받아서 MySQL과 연결된 Connection을 구하기 위함.

(엄밀히 말하면 DataSource => AbstractDataSource -> AbstractDriverBasedDataSource -> DriverManagerDataSource | =>는 구현, ->는 상속)

결론적으로 DataSourced인터페이스를 구현해놓은 DriverManagerDataSource 클래스가 이 모듈에 있고 

이 클래스는 Connection을 구하는 여러 과정들이 구현되어 있다.

사용자는 빈 등록시 MySQL드라이버 이름, 접속시 필요한 URL, UserName, Password를 등록하면 

그 정보를 토대로 코드에서 DataSource객체에 빈을 받아서 Connection을 구할 수 있다.

코드에서는 MySQL드라이버 이름, URL, UserName, Password등의 정보들을 입력하지 않고, 

DataSource객체를 통해서 Connection을 바로 구할 수 있다.


- mybatis-spring

mybatis와 spring을 연결하는 역할을 한다. 

mybatis에 있는 인스턴스들, 클래스들과 spring에 있는 인스턴스들, 클래스들을 구현 및 상속하고 있다.

SqlSessionFactoryBean클래스는 DataSource와 mybatis-config.xml파일을 매개변수로 받아서

mybatis에 있는 SqlSessionFactory인터페이스를 구현한 클래스(DefaultSqlSessionFactory)를 반환하고 

그 클래스로 SqlSession인터페이스를 구현한 클래스(DefaultSqlSession)를 구한다.


- mybatis : mybatis-spring에서 사용된 SqlSessionFactoryBean클래스, SqlSessionFactory인터페이스, SqlSession인터페이스 등이 있다.

- spring-test : test를 위한 모듈. SpringJUnit4ClassRunner클래스를 포함하고 있다.


2. root-context.xml 설정 및 모듈의 역할들.

1. DriverManagerDataSource 설정

- driverClassName, url, username, password 속성을 등록한다.

2. SqlSessionFactoryBean 설정.

- dataSource 속성에 1번에서 등록한 빈을 지정한다.(ref속성 사용)

- configLocation 속성에 "mybatis-config.xml"의 경로를 지정한다.

(xml파일은 미리 생성해둔다. src/main/resources폴더 아래 두고 "classpath:/파일이름.xml"형태로 등록하면 된다.)

3. 코드에 SqlSessionFactory객체를 생성해 두고 @Inject애노테이션으로 2번빈이 연결되도록 한다.

(2번빈은 SqlSessionFactory인터페이스가 구현된 DefaultSqlSessionFactory클래스를 반환한다.)


** 복잡한 과정인듯 보인다. 간략히 설명하면, spring-jdbc는 MySQL과 직접 데이터 교류가 가능한 모듈이다. 

연결 관련 정보를 받기위해 DataSource인터페이스를 구현해두었다.

하지만, MyBatis를 이용하려 한다. (spring-jdbc에 등록된 정보를 넘겨받아 대신 MySQL과의 통신역할을 하려는 것이다.)

spring-jdbc를 대신해서 mybatis를 사용하는 이유는 아래와 같다. (상대적인것이다..)

- 간결한 코드의 처리

- SQL문의 분리운영

- Spring과의 연동으로 자동화된 처리

- 동적 SQL을 이용한 제어기능. 

(코드로 배우는 스프링 웹 프로젝트에서 발췌)


쉽게 말해서 코드는 더 간결하게, 더 풍부한 기능을 사용하기 위한 것이다. 그래서 


1. DriverManagerDataSource에 MySQL 접속과 관련된 정보를 등록하고 (spring-jdbc모듈)

2. SqlSessionFactoryBean에 1번에서 등록한 빈과 mybatis설정이 등록된 xml파일을 등록한다. (mybatis-spring 모듈)

3. 2번에서 등록된 빈을 통해서 코드에서 SqlSessionFactory를 구하고 (mybatis 모듈

4. 3번에서 구한 SqlSessionFactory객체에서 SqlSession객체를 구한다. (mybatis 모듈 


** 모듈별 사용 클래스 **

사용모듈 : sprint-jdbc (bean에 등록)

클래스 : org.springframework.jdbc.datasource.DriverManagerDataSource


사용모듈 : mybatis-spring (bean에 등록)

클래스 : org.mybatis.spring.SqlSessionFactoryBean


사용모듈 : mybatis (코드에서 사용)

클래스 : org.apache.ibatis.session.SqlSessionFactory

클래스 : org.apache.ibatis.session.SqlSession


사용모듈 : spring-test (코드에서 애노테이션에 사용)

클래스 : org.springframework.test.context.junit4.SpringJUnit4ClassRunner



3. Test

순서는 아래와 같다.

- 우선 spring-jdbc에서 등록한 bean을 통해서 Connection연결을 확인한다. (Connection 확인.)

- 연결이 되었다면 mybatis, mybatis-spring으로 위에서 생성된 DataSource 빈을 받아 연결 테스트. (SqlSession 확인)


@RunWith 애노테이션 

- 매개변수로 SpringJUnit4ClassRunner.class를 받는다. 이 클래스는 spring-test모듈에 존재한다.

스프링의 테스트 JUnit을 지정하는 역할인 듯 하다. 이 녀석을 가지고 동작하는 듯 하다.


@ContextConfiguration 애노테이션

- locations 속성이 있고 root-context.xml파일의 경로를 지정해 준다.

설정된 경로의 파일을 토대로 스프링을 로드한다.


@Inject : 해당 자료형으로 등록된 빈을 매개변수, 또는 맴버변수에 전달해주는 역할.



** mysql 6.0.5버전 모듈 사용시 root-context.xml 설정 때 오류 발생.

문구 : 

 The reference to entity "serverTimezone" must end with the ';' delimiter (root-contex.xml에서 볼 수 있는 문구)

 "serverTimezone" 엔티티에 대한 참조는 ';' 구분자로 끝나야 합니다.  (test 수행시 Console에 출력되는 문구)

몇가지 테스트를 해보니 "&"기호에 대한 오류였다.

구글링을 통해서 얻은 해답. 아래와 같이 변경한다.


&  ⇒  &

해결.

Comments