[Spring]Spring과 Mybatis 연동하기

Spring과 Mybatis 연동하기

Imagem de capa

Spring 개발 중 DB와 연동하기 위해선 Mybatis를 활용하면 편하다. Mybatis란 흔히 ‘SQL 매핑 프레임워크’ 로 분류되는데, 개발자들이 JDBC 코드의 복잡한 작업을 피하는 용도로 많이 사용된다. Mybatis의 특징으로는

Mybatis와 Spring을 연동하기 위해서는 아래와 같이 진행하면 된다.(이 글에서는 Mybatis를 활용하여 MariaDB에 접속할 것이다.)


1) pom.xml에 mybatis를 위한 라이브러리 추가(mybatis, mybatis-spring, spring-tx, spring-jdbc 등). 해당 라이브러리들은 maven repository에서 검색하여 최신 버전으로 다운받는다. 추가로 connection pool, lombok, spring-test, sql logging 을 위한 라이브러리도 다운받는다.


2) applicationContext.xml(혹은 root-context.xml)에 DB 연동을 위한 bean 등록(HikariCP, dataSource, SQLSessionFactory 등)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- HikariCP connection pool bean 셋팅-->
    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mariadb://127.0.0.1:3306/test"></property>
        <property name="username" value="root"></property>
        <property name="password" value="1111"></property>
    </bean>

    <!-- 커넥션 pool을 사용할 dataSource bean 셋팅-->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <constructor-arg ref="hikariConfig"></constructor-arg>
    </bean>

    <!-- DB connection 및 SQL전달/리턴을 위한 SQLSession을 만들어내는 SQLSessionFactory bean 셋팅-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- base-package 에 정의된 package 내 클래스 및 xml을 SQL 처리를 위한 mapper로 인식-->
    <mybatis-spring:scan base-package="com.tpptu.mapper" />

    <!-- base-package에 정의된 package내 소스 중 @Component가 작성된 Class를 bean으로 인식-->
    <context:component-scan base-package="com.tpptu.service" />

</beans>

3) src/main/java/패키지명/mapper에 TimeMapper 인터페이스를 생성한다

TimeMapper.java

package com.zptutxptc.mapper;

public interface TimeMapper {
    public String getTime();
}


4) src/main/resources/디렉토리명/mapper에 TimeMapper.xml을 생성한다(TimeMapper인터페이스의).namespace에 정의된 명과 인터페이스명이 동일하면 두개를 병합하여 처리한다. 또한 select 태그의 id속성의 값은 인터페이스의 메서드와 동일하게 맞춰야 한다. 그리고

TimeMapper.xml

<?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.tpptu.mapper.TimeMapper">
    <select id="getTime" resultType="string">
        select sysdate() from dual
    </select>
</mapper>

5) /src/test/java/패키지명/mapper에 해당 mapper를 테스트를 하기 위한 MapperTests 클래스를 생성한다.(추가로 dataSource와 SQLSessionFactory도 테스트를 진행해보자.)

MapperTests.java

package tpptu.mapper;

import com.tpptu.mapper.TimeMapper;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.sql.DataSource;
import java.sql.Connection;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring-config/applicationContext.xml")
@Log4j
public class MapperTests {

    @Setter(onMethod_ = {@Autowired})
    private DataSource dataSource;
    @Setter(onMethod_ = {@Autowired})
    private SqlSessionFactory sqlSessionFactory;
    @Setter(onMethod_ = {@Autowired})
    private TimeMapper timeMapper;

    @Test
    public void testMyBatis() {
        try (SqlSession session = sqlSessionFactory.openSession();
        Connection con = session.getConnection();
        ) {
            log.info(session);
            log.info(con);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testGetTime() {
        log.info("TimeMapper Class Name : " + timeMapper.getClass().getName());
        log.info("getTime : " + timeMapper.getTime());
    }
}


6) 테스트를 진행하면 정상적으로 시간이 출력되는 것을 확인할 수 있다.


*출처 : ++코드로 배우는 스프링 웹 프로젝트(개정판)++ 참고