4. SpringBoot와 MyBatis 연동

마이바티스(MyBatis)란

마이바티스는 쿼리 기반 웹 애플리케이션을 개발할 때 가장 많이 사용되는 SQL Mapper 프레임워크이다.

마이바티스는 기존의 JDBC를 이용하여 개발하는 방식에 비해 개발자의 부담을 덜어 주고 생산성을 향상시켜 준다. JDBC를 이용하여 프로그래밍 하는 방식은 글래스나 JSP와 같은 코드안에 SQL문을 작성하는 방식이었다. 따라서 SQL의 변경등이 발생할 경우 프로그램을 수정해야 하기 때문에 유연성이 좋지 못하고 여러가지 코드가 복잡하게 섞여 있어서 가독성이 매우 떨어졌다. 마이바티스에서는 SQL을 XML 파일에 작성하기 때문에, SQL의 변환이 자유롭고 가독성도 좋다는 장점이 있다.

마이바티스 설정

앞에서 만들었던 DatabaseConfiguration 클래스를 아래와 같이 수정한다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.ckbs.MariaDbTest.configuration;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@PropertySource("classpath:/application.properties")
public class DatabaseConfiguration {

@Autowired
private ApplicationContext applicationContext;

@Bean
@ConfigurationProperties(prefix="spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}

@Bean(destroyMethod = "close")
public DataSource dataSource() throws Exception {
DataSource dataSource = new HikariDataSource(hikariConfig());
// System.out.println(dataSource.toString());
return dataSource;
}

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/*.xml"));
return sqlSessionFactoryBean.getObject();
}

@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

이를 처음과 비교하면 아래와 같다.

DatabaseConfiguration 클래스 before/after 비교

@Autowired

의존 객체 자동 주입(Automatic Dependency Injection)은 스프링 설정파일에서 <constructor-arg> 혹은 <property> 태그로 의존 객체 대상을 명시하지 않아도 스프링 컨테이너가 자동적으로 의존 대상 객체를 찾아 해당 객체에 필요한 의존성을 주입하는 것을 말한다.

@Autowired는 주입하려고 하는 객체의 타입이 일치하는지를 찾고 객체를 자동으로 주입한다. 만약에 타입이 존재하지 않는다면 @Autowired에 위치한 속성명이 일치하는 bean을 컨테이너에서 찾는다. 그리고 이름이 없을 경우 @Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입한다.

타입 => 이름 => Qualifier => Fail

@Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메소드에 적용하면 @Autowired로 빈을 부를 수 있다.

SqlSessionFactory

마이바티스에서는 SqlSession를 생성하기 위해 SqlSessionFactory를 사용한다.

SqlSessionFactory는 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체이다.

SqlSessionFactory를 생성해주는 특별한 객체를 먼저 설정해주어야하는데, 이때 스프링-마이바티스에서는 SqlSessionFactoryBean이라는 클래스를 사용한다.

만약 스프링이 아닌 마이바티스 단독으로 사용할 경우에는 SqlSessionFactoryBuilder를 사용한다.

1
sqlSessionFactoryBean.setDataSource(dataSource);

에서 앞에서 만든 데이터 소스를 설정한다.

1
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/*.xml"));

여기에서는 마이바티스 Mapper 파일의 위치를 설정한다. Mapper는 애플리케이션에서 사용할 SQL을 담고있는 XML파일을 의미한다.

애플리케이션에는 일반적으로 많은 수의 매퍼파일이 존재하고, 이를 하나씩 등록하기 어렵기 때문에 한번에 등록하기 위해 **을 사용한다.

**은 하위 폴더를 모두 뜻하고, *.xml은 xml 파일 전체를 뜻한다.

SqlSessionTemplate

SqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다.

SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 한다.

SqlSessionTemplate 은 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유할수 있다.

getMapper()에 의해 리턴된 매퍼가 가진 메서드를 포함해서 SQL을 처리하는 마이바티스 메서드를 호출할때 SqlSessionTemplate은 SqlSession이 현재의 스프링 트랜잭션에서 사용될수 있도록 보장한다.

추가적으로 SqlSessionTemplate은 필요한 시점에 세션을 닫고, 커밋하거나 롤백하는 것을 포함한 세션의 생명주기를 관리한다.

또한 마이바티스 예외를 스프링의 DataAccessException로 변환하는 작업또한 처리한다.

Mapper 폴더 생성

다음으로 Mapper폴더를 생성한다. Mapper 폴더는 애플리케이션에서 사용할 쿼리를 담고 있는 XML 파일을 저장한다.

src/main/resources 폴더 밑에 mapper 폴더를 생성한다.

Mapper 폴더 생성

아래는 추후에 설명할 게시판에서 사용될 mapper xml의 샘플이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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="com.ckbs.MariaDbTest.board.mapper.BoardMapper">
<select id="selectBoardList" resultType="com.ckbs.MariaDbTest.board.dto.BoardDto">
<![CDATA[
SELECT
board_idx,
title,
hit_cnt,
DATE_FORMAT(created_datetime, '%Y.%m.%d %H:%i:%s') AS created_datetime
FROM
t_board
WHERE
deleted_yn = 'N'
ORDER BY board_idx DESC
]]>
</select>
</mapper>

위와같이 XML에는 SQL에 접근할 수 있는 쿼리문이 작성되어 있다.

이에 관한 자세한 설명은 추후 다른 포스트에서 계속 한다.

공유하기