본문 바로가기

SpringFramework/Spring

Spring - Mybatis FrameWork 개념 및 설정

MyBatis란?

: 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM 프레임워크이다.

  • Hibernate나 JPA처럼 새로운 DB프로그래밍 패러다임을 익혀야하는 부담 없이 SQL 쿼리를 그대로 사용한다. 따라서, 복잡한 쿼리에도 대응이 가능하다.
  • 도메인 객체나 VO객체를 중심으로 개발이 가능하다.
    (개발자가 정의하는 DTO, VO 등의 클래스 매핑이 가능)
  • SQL을 별도의 파일(.xml)로 분리해서 관리하게 해준다. 또한, JDBC코드 작성의 불편함도 해소된다.
    JDBC는 DB연동에 필수적으로 사용하는 것인데, JDBC만 사용하여 쿼리문을 작성하면, java코드와 쿼리코드가 겹치면서 관리가 어렵게 되는데, Mybatis는 이 둘을 분리시켜서 저장관리 할 수 있게 해주며, 내부적으로 JDBC와 연동하여 호출 할 수 있도록 설계되어 있다. 흐름은 아래의 그림과 같다.

 

MyBatis의 주요 컴포넌트 역할

- MyBatis 설정파일(SqlMapConfig.xml) : 데이터베이스의 접속 주소 정보나 Mapping 파일의 경로 등의 고정된 환경정보를 설정한다.

- SqlSessionFactoryBuilder : MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성한다.

- SqlSessionFactory : SqlSession을 생성한다.

- SqlSession : 핵심적인 역할을 하는 클래스로서 SQL실행이나 트랜잭션 관리를 실행한다. SqlSession Object는 Thread-Safe 하지 않으므로, Thread마다 필요에 따라 생성함.

- Mapping 파일(.xml) : SQL문과 OR Mapping을 설정

- SqlSessionFactoryBean : MyBatis 설정파일을 바탕으로 SqlSessionFactory를 생성한다. (Spring Bean으로 등록해야 한다)

- SqlSessionTemplate : 핵심적인 역할을 하는 클래스로서 SQL실행이나 트랜잭션 관리를 실행한다. SqlSession Interface를 구현하며, Thread-Safe하다. (Spring Bean으로 등록해야 한다)

 

(!) Spring Boot에서, mybatis-spring-boot-starter를 통해 DI하는 경우에는, mybatis-spring-boot-autoconfigure-2.1.1.jar 패키지 내의 MybatisAutoConfiguration Class에서 SqlSessionFactoryBean과 SqlSessionTemplate을 생성하여 자동으로 Bean에 등록해주고 있어서, 별도로 클래스를 추가하여 등록해 줄 필요는 없어진다. (스프링부트가 여러모로 편리하다)

 

MyBatis properties 설정

1] 기본적으로, 연동할 JDBC관련 DBCP에 대상 설정값이 필요하다.

  • spring.datasource.url: jdbc:[DBMS]://domain/DB명?parameter=param
    ex) jdbc:mysql://localhost:3306/ep_exam?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
  • spring.datasource.username: 아이디
  • spring.datasource.password: 비밀번호
  • spring.datasource.driver-class-name: JdbcDriver Class 설정
    ex) org.mariadb.jdbc.Driver (MariaDB) / com.mysql.cj.jdbc.Driver (MySQL)

2] mybatis 관련

- Spring Boot 공식문서: https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

 

- 주요 설정 Property 설명

  • mybatis.type-aliases-package: mybatis 매핑 type을 짧게 쓰기 위한 설정
    ex) com.we.test 로 설정시, com.we.test.example.ExampleVo를 example.ExampleVo로 짧게 사용이 가능하다.
  • mybatis.mapper-locations: xml파일이 위치한 경로를 설정한다. (root는 /resources이며, wild card 사용가능)
    ex) mybatis.mapper/**/*.xml => resources밑에 mapper.board폴더 아래의 (아무폴더) / (아무 이름.xml) 파일들이 대상이다.

MyBatis Connection Pool 관련 설정

: Mybatis는 스프링부트 2.0이상부터는 HikariCP라는 DB Connection Pool을 기본적으로 지원하도록 되어있다. 따라서, Default DataSource로 사용하는 경우, 우리는 몇가지 원하는 설정값으로 변경할 수 있다.

 

(!) 기본 값으로 설정되는 경우에는, DB쪽 커넥션을 열어놓고 유지시켜놓는데(sleep상태), 때로는 커넥션을 유지하지 않고 싶은 경우가 있을 것이다. 그런 경우에는 아래의 옵션을 설정해주면 된다.

  • spring.datasource.hikari.maximum-pool-size : pool에 유지시킬 수 있는 최대 커넥션 수 (default: 10)
  • spring.datasource.hikari.minimum-idle : 아무런 일을 하지않아도 커넥션을 유지시키는 커넥션 수 (default: maximum-pool-size와 동일)
    => 0으로 설정시, 유휴상태일 때, 커넥션 해제
  • spring.datasource.hikari.idle-timeout : 유휴상태의 커넥션 유지시간 (minimum: 10000(=10초))
  • spring.datasource.hikari.connection-timeout : 클라이언트가 pool에 커넥션을 요청하는데 기다리는 최대 시간을 설정. 초과시 SQLException이 발생 (default: 30000(=30초))
  • spring.datasource.hikari.max-lifetime : 커넥션의 최대 유지 시간을 설정한다.(default: 1800000(=30분))
  • spring.datasource.hikari.read-only : pool에서 얻은 커넥션이 기본적으로 readOnly인지 지정하는 설정. DB가 readOnly 속성을 지원할 경우에만 사용할 수 있다.(default: false)

MyBatis Cache 관련 이슈 및 설정

MyBatis는 자체적으로 Cache를 제공한다. MyBatis는 크게 2종류의 Cache를 제공한다.

  • Local Cache
  • Second Level Cache

= Local Cache

MyBatis는 순환참조를 막거나 반복된 쿼리의 속도를 높히기 위해 Local Cache를 사용한다.

MyBatis에서 별도 설정을 하지 않아도 항상 켜져있는 Cache이다. (Local Cache는 개발자가 임의로 켜고 끌 수 없다) 따라서 기본적으로 모든 SESSION을 캐시하여 사용한다.

이는 적용 범위만 조정가능한데 Config 파일에 아래와 같이 작성하면, 적용범위가 조정이 가능하다.

  • cacheEnabled: 각 Mapper에 설정된 캐시를 전역적으로 사용할지 사용하지 않을지에 대한 여부
  • localCacheScope
    • SESSION: session이 유지되는 순간
    • STATEMENT: mapper에 정의된 액션 하나의 범위

Local Cache는 SqlSession 객체에 대한 commit(), rollback(), close() (오토 commit 제외), clearCache() 가 호출 될 때 캐시가 만료됨.

 

= Second Level Cache

Mapper NameSpace 단위로 동작한다. 디테일한 제어가 가능하다. 캐시를 사용하지 않도록 조정하는 방법은 2가지이다.

1] mapper() 에서 데이터 추출후에, SqlSession.clearCache() 호출

2] SQL Mapper 선언부분에 설정

<select id="getTest" parameterType="com.we.test.vo.ExampleVo"
    resultType="com.we.test.vo.ResultExampleVo" flushCache="true" useCache="false">

 

= Mapper 속성값

속성 설명
id 구분을 찾기 위해 사용될 수 있는 네임스페이스내 유일한 구분자
parameterType 구문에 전달될 파라미터의 패키지 경로를 포함한 전체 클래스명이나 별칭
resultType 이 구문에 의해 리턴되는 기대타입의 패키지 경로를 포함한 전체 클래스명이나 별칭. collection인 경우, collection타입 자체가 아닌 collection이 포함된 타입이 될 수 있다. resultType이나 resultMap 사용 권장
resultMap 외부 resultMap의 참조명. 결과맵은 Mybatis의 가장 강력한 기능이다.
flushCache 이 값을 true로 세팅하면 구문이 호출될때마다 로컬, 2nd 레벨 캐시가 지워진다.
useCache 이 값을 true로 세팅하면 구문의 결과가 2nd 레벨 캐시에 캐시 된다.
timeout 예외가 던져지기 전에 데이터베이스의 요청 결과를 기다리는 최대시간을 설정한다. default는 세팅하지 않는 것이고 드라이버에 따라 다소 지원되지 않을 수 있음
fetchSize 지정된 수만큼의 결과를 리턴하도록 하는 드라이버 힌트 형태의 값이다.
default는 셋팅하지 않는 것이고 드라이버에 따라 다소 지원되지 않을 수 있음
statementType STATEMENT, PREPARED 또는 CALLABLE중 하나를 선택할 수 있다. Mybatis에게 Statement, PreparedStatement 또는 CallableStatement를 사용하게 한다.
(default: PREPARED)
resultSetType FORWARD_ONLY, SCROLL_SENSITIVE, SCROLL_INSENSITIVE 중 하나를 선택할 수 있다.
default는 세팅하지 않는 것이고 드라이버에 따라 다소 지원되지 않을 수 있음
resultOrdered 내포된 결과를 조회하는 구문에서만 적용이 가능. true로 설정하면 내포된 결과를 가져오거나 새로운 주요 결과 레코드를 리털할 때 함께 가져오도록 한다. 이전의 결과 레코드에 대한 참조는 더이 이상 발생하지 않는다. 이 설정은 내포된 결과를 처리할때 조금 더 많은 메모리를 채운다.
(default: false)
참고문서: https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

 

참고

- https://12bme.tistory.com/364

- http://dveamer.github.io/backend/MybatisCache.html

- https://yenaworldblog.wordpress.com/2018/02/06/mybatis-cache-disable-%EC%BA%90%EC%8B%9C-%EC%9B%90%EC%9D%B8-%EB%B0%8F-%EC%82%AD%EC%A0%9C-%EB%B0%A9%EB%B2%95/