일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 50mm
- AF-S 18-35mm
- daily
- af-s 18-35
- 푸른초장교회
- Nikon
- 50mm f/1.8G
- 사진
- camera
- 경치
- Photo
- 니콘
- 일상
- 85mm f/1.8G
- AF-S NIKKOR 50mm f/1.8G
- D750
- 85mm 1.8g
- spring
- 푸초
- 18-35mm
- nikkor
- 렌즈
- 여름성경학교
- 출사
- AF-S NIKKOR 85mm f/1.8G
- 풍경
- 꽃
- 하늘풍경
- AF-S NIKKOR 18-35mm f/3.5-4.5G ED
- 카메라
- Today
- Total
병갈이 블록
코드로배우는 - mybatis 연결 본문
오늘의 정리.
*** 스프링과 MyBatis와 MySQL의 연결 ***
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에 출력되는 문구)
몇가지 테스트를 해보니 "&"기호에 대한 오류였다.
구글링을 통해서 얻은 해답. 아래와 같이 변경한다.
& ⇒ &
해결.
'IT(Old) > Spring 공부 기록' 카테고리의 다른 글
코드로배우는 - 기본적인 동작들. (0) | 2017.07.31 |
---|---|
코드로 배우는 - servlet-context.xml 에 관해서 간단히 (0) | 2017.07.31 |
코드로배우는 - 1일차. (0) | 2017.07.28 |
멀티 뷰리졸버 구현..(라기 보다는...각기 다른 경로의 경로페이지를 뷰로 사용하기.) (0) | 2017.07.28 |
Spring DB접속 도전기!! (0) | 2017.07.26 |