Spring Boot Mybatis 설정


Spring Boot Mybatis 구성 및 설정에 대해서 설명한다.

모듈 구조

Maven Dependency

mybatis-spring-boot-starter 추가

pom.xml
1
2
3
4
5
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>

Spring Boot Mybatis 모듈을 사용하려면 mybatis-spring-boot-autoconfigure 필요하다. mybatis-spring-boot-autoconfiguremybatis-spring-boot-starter에 종속 되어있는걸 확인 할 수 있다.

mybatis-spring-boot-starter\pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>

Spring Boot Mybatis 구조

inmemory db(H2) Maven Dependency

mybatis를 이용하기 위해서 Inmemory DB(H2)를 애플리케이션이 동작하면 구성 되도록 설정했다. 개인 DB가 설정 되어있다면 inmemory db(H2) Maven Dependency는 제외 해도 된다.

pom.xml
1
2
3
4
5
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

스프링 부트는 schema.sqldata.sql에서 각각 SQL을 자동 로드 한다.

schema.sql
1
2
3
4
5
6
CREATE TABLE USER
(
id integer NOT NULL,
full_name varchar(255) not null,
primary key(id)
);

data.sql
1
2
3
INSERT INTO USER (id, full_name) VALUES (1, 'jaehyun');
INSERT INTO USER (id, full_name) VALUES (2, 'jinsil');
INSERT INTO USER (id, full_name) VALUES (3, 'nada');

application.xml

application.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
datasource:
username: sa
password:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
hikari:
jdbc-url: jdbc:h2:~/test
initialization-mode: always

mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
lazyLoadingEnabled: true
aggressiveLazyLoading: false
mapUnderscoreToCamelCase: true

Mybatis 자동설정에 대한 구조 확인

spring-configuration-metadata.json
1
2
3
4
5
6
7
8
...
{
"sourceType": "org.mybatis.spring.boot.autoconfigure.MybatisProperties",
"name": "mybatis.mapper-locations",
"description": "Locations of MyBatis mapper files.",
"type": "java.lang.String[]"
},
...

위와 같이 mybatis 설정은 name에 자동 설정 되어 있는 것을 확인할 수 있다.

Domain

User.java
1
2
3
4
5
6
7
8
9
@Builder @AllArgsConstructor @NoArgsConstructor
@Getter @Setter @ToString
@EqualsAndHashCode(of = "id")
public class User {

private int id;
private String nameName;

}

Mapper

Spring Boot Mybatis는 기본적으로 @Mapper 주석으로 표시된 매퍼를 검색 한다.

UserMapper.java
1
2
3
4
5
6
@Mapper
public interface UserMapper {

User getUserInfo(int id);

}
UserMapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="me.mybatis.UserMapper">

<select id="getUserInfo" resultType="me.mybatis.User">
SELECT
ID
, FULL_NAME
FROM
USER
WHERE
ID = #{id}
</select>

</mapper>

Service

UserService.java
1
2
3
4
5
6
7
8
9
10
11
12
@Service
@Slf4j
@AllArgsConstructor
public class UserService {

private UserMapper userMapper;

public User getUserInfo(int id) {
return userMapper.getUserInfo(id);
}

}

Controller

UserController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Slf4j
@AllArgsConstructor
@RequestMapping(value = "/user", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@RestController
public class UserController {

private final UserService userService;

/**
* 사용자 정보 조회
* @param id
* @return
*/
@GetMapping("/{id}")
public ResponseEntity getUserInfo(@PathVariable int id) {
User user = userService.getUserInfo(id);
log.debug("users {}", user);

return ResponseEntity.ok(user);
}

}

결과 화면

소스코드

참조