Java&Web

[MyBatis] Springboot에 MyBatis-Spring 설정하기(1)

프로그래민 2020. 12. 31. 17:17
반응형

[MyBatis] MyBatis란

 

[MyBatis] MyBatis란

MyBatis란? MyBatis는 객체 지향 언어인 Java의 관계형 데이터베이스 프로그래밍을 좀더 쉽게 도와주는 퍼시스턴스 프레임워크(Persistence Framework, 데이터를 다루는 클래스 및 설정파일 집합)이다. MyBati

minkwon4.tistory.com

 

지난번 포스팅때 MyBatis에 대해 조사하였는데, 조사하다가 Spring 환경에서 사용하기 적합하게 나온 Mybatis-Spring에 대해 알게 되어 조사해보았다.

 

MyBatis-Spring의 주요 컴포넌트

이름 설명
SqlSessionFactoryBean SqlSessionFactory를 작성하고 Spring DI 컨테이너에 저장하는 구성요소
기본적으로 MyBatis에선 SqlSessionFactory를 생성할 때 MyBatis 설정 파일을 기준으로 하지만 Mybatis-Spring의 경우 SqlSessionFactoryBean을 기반으로 설정파일 없이 SqlSessionFactory를 빌드 가능
MapperFactoryBean Singleton Mapper를 작성하고 Spring DI 컨테이너에 저장하는 구성요소
SqlSessionTemplate SqlSession 인터페이스를 구현하는 Singleton 버전의 SqlSession 구성 요소
기본적으로 MyBatis에선 SqlSession이 Thread-safe하지 않지만 SqlSessionTemplate을 구현체로 이용한다면 Thread-safe한 환경을 구성 가능

 

MyBatis-Spring의 DB Access 순서

MyBatis-Spring 순서

애플리케이션 실행시 시작되는 프로세스는 다음과 같다.

   (1) SqlSessionFactoryBean은 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청
   (2) 애플리케이션은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory의 SqlSession을 가져옴
   (3-1) SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성
   (3-2) SqlSessionFactory는 Spring DI 컨테이너에 의해 저장
   (4) MapperFactoryBean은 SqlSessionTemplate으로 SqlSession을 생성 및 Mapper 개체 생성

클라이언트의 요청에 따라 수행되는 프로세스는 다음과 같다.

   (5) 클라이언트의 애플리케이션에 대한 요청
   (6) 애플리케이션은 Spring DI 컨테이너에서 주입한 Mapper 개체를 호출
   (7) Mapper 개체는 호출된 메소드에 해당하는 SqlSession 메소드를 호출
   (8) SqlSession은 프록시 사용 및 메소드를 호출
   (9) 트랜잭션에 할당된 SqlSession이 없다면 SqlSessionFactory를 호출하면 SqlSession을 가져옴
   (10) SqlSessionFactory가 SqlSession을 반환
   (11) SqlSession은 Mapping 파일에서 실행할 SQL을 실행

이러한 과정을 거치는 MyBatis-Spring을 직접 Springboot+maven+MySQL에 application.properties의 설정만으로 적용하는 실습을 해보았다.

 

MyBatis-Spring 실습(1)

pom.xml에 dependency 추가

MySQL connector와 MyBatis-Spring

일단 개발환경을 조성해주기위해 위와 같은 dependency들을 추가해주었다. MySQL을 사용하기에 MySQL connector를 추가 시켜주었고 MyBatis-Spring을 추가시켜서 MyBatis 프레임워크 환경을 구성해주었다. 위의 결과 아래와 같은 라이브러리들이 추가된 것을 확인할 수 있었다.

MySQL connector와 MyBatis-Spring

위 라이브러리들을 자세히보면 MyBatis-Spring-boot-starter에는 MyBatis, MyBatis-Spring 뿐만 아니라 JDBC라이브러리도 포함되어있고 Connection Pool의 역할을 하는 HikariCP도 포함되어있는 것을 확인할 수 있다.

application.properties 설정

application.properties

위의 dependency를 추가해준후 application.properties를 설정해주었다. 기본적으로 MySQL에 대한 JDBC설정을 잡아주었다. 그 후 기본적으로 XML파일에서 잡아주던 MyBatis 설정을 application.properties에서 해주었다. type-aliases-package는 mapper의 resultType에 대한 alias를 해주는 것이고, mapper-locations에는 mapper들이 위치한 곳의 경로(main/java/resources/mapper의 XML파일)를 설정해주었다.

Mapper XML 및 DAO 작성

testMapper.xml

test할 SQL을 작성해놓은 testMapper.xml을 생성하였다. 그 후 id 값을 파라미터로 받아 content를 출력해주는 SELECT 쿼리를 작성해주었다. 여기서 주의할점은 mapper태그에 있는 namespace에 해당 mapper파일이 구현이될 DAO 클래스에 맞게 주어져야한다. 또한 작성한 쿼리문의 id값을 잘 기억하고 있어야한다.

TestDao.java

그 후 DAO를 작성해주었다. 여기서는 여러가지를 주의해서 작성해야한다. 첫번째로, @Mapper 이 어노테이션을 작성해주어야지 Spring DI 컨테이너의 관리를 받을 수 있다. 두번째로, interface의 형태를 가져야한다. 세번째로, 정의할 메소드 네임과 작성한 XML형식의 mapper의 쿼리문 id 값을 꼭 통일 시켜줘야한다. 

출력확인

MySQL의 test 테이블 데이터
출력확인을 위한 RestController

앞서 정의한 testDao의 selectContent 메소드를 출력해보기위해 테이블에 값을 넣고 Test용 Controller를 구성해주었다. 그 후 서버를 실행시킨후 값을 확인해보았다. 

출력결과

그 결과 원하던 결과였던 Hello World를 MyBatis-Spring 환경에서 얻는 것을 확인할 수 있었다.

다음 포스팅에서는 application.properties만의 설정이 아닌 DatabaseConfig.java 파일을 이용하여 Springboot+MyBatis의 실습을 할 예정이다.

 

출처
lts0606.tistory.com/249
goddaehee.tistory.com/205
반응형