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
'SpringFramework > Spring' 카테고리의 다른 글
Spring - RestTemplate (0) | 2021.10.08 |
---|---|
Spring - ResponseEntity (0) | 2021.10.08 |
Spring Package 구조와 역할 (0) | 2021.09.30 |
Jenkins를 이용한 서버 Spring Boot 배포 - pipeline (0) | 2021.09.15 |
Spring - 자주사용하는 Annotation 정리 (0) | 2021.02.24 |