Java/Spring

[Spring] Spring Mybatis 설정

jwKim96 2019. 6. 2. 02:44

MyBatis를 Spring에서 설정하는 방법을 알아보겠습니다.

사용되는 모듈은 다음과 같습니다.

  • MyBatis 3 3.4.6
    JDBC Wrapper로 JDBC로 보다 더 편하게 DB 작업을 수행할 수 있게 해주는 모듈
  • MyBatis-Spring 1.3.2
    MyBatis를 기반으로 기능을 확장한 모듈로, MyBatis와 Spring을 연동해 주는 모듈
    MyBatis의 SqlSession 은 기본적으로 Thread-Safe 하지 않습니다.
    하지만 MyBatis-Spring 의 SqlSession 을 확장하여 SqlSessionTemplate 이라는
    Thread-Safe 한 클래스를 제공하합니다.
  • Spring-jdbc 5.1.5.RELEASE
  • mysql connector java 8.0.13 (DB 버전에 에 맞는 jdbc 선택)

이제 MyBatis 설정 순서를 알아보겠습니다.

1. Dependency추가.

https://mvnrepository.com

<!-- Mysql ConnectorJ -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>

<!-- SpringJdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>

<!-- Mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>

<!-- Mybatis Spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>

위 내용을 pom.xml에 추가

mysql이 아닌경우 Mysql Connector J 대신 자신이 쓰는 db에 맞춰서 dependency 를 추가하시면 됩니다.

2. src/resources 디렉토리에 mybatis-config.xml 파일 생성.

파일을 생성하고, 아래 링크에서 XML에서 SqlSessionFactory 빌드하기를 참조하여 xml파일에 붙여넣습니다.
SqlSessionFactory 빌드하기의 예제에서는 mapper설정 구문이 들어가 있습니다.
하지만, MyBatis-Spring을 사용할 것이기 때문에 지워주면 됩니다.

http://www.mybatis.org/mybatis-3/ko/getting-started.html

<configuration>

안의 내용 모두 삭제

</configuration>

3. DataSource 설정

3-1. src/resources/config/database.properties (File)

데이터베이스 접속에 필요한 정보들을 properties파일로 저장합니다.

database.properties에 다음과 같이 내용을 추가하고

자신의 데이터베이스에 맞게 driverClass와 url, username, password를 입력합니다.

mysql 5.7+ : driverClass=com.mysql.cj.jdbc.Driver
~mysql 5.7 : driverClass=com.mysql.jdbc.Driver

db.driverClass=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/[DB 이름]
db.username=[DB 사용자 이름]
db.password=[DB 사용자 암호]

2) /WEB-INF/spring/datasource.xml (Spring Bean Configuration File)

그 다음 datasource.xml 설정

먼저 namespace에서 context에 체크를 해주면 됩니다.

그 다음 datasource.xml에 아래 내용을 작성합니다.

<context:property-placeholder location="classpath:config/database.properties" />

<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
  <property name="driverClass" value="${db.driverClass}" />
  <property name="url" value="${db.url}" />
  <property name="username" value="${db.username}" />
  <property name="password" value="${db.password}" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation" value="classpath:mybatis-config.xml" />
  <property name="mapperLocations">
    <list>
      <value></value>
    </list>
  </property>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg ref="sqlSessionFactory" />
</bean>

<context:property-placeholder ~> : location경로의 파일을 property 파일로서 불러와 사용하겠다는 문장

그리고 dataSourceSqlSessionFactory, sqlSession bean을 등록합니다.
dataSource는 connection에 필요한 정보를 property로 가집니다.
SqlSessionFactorySqlSession을 만들기 위한 정보들을 property로 가집니다.
sqlSession은 Thread-Safe한 SqlSessionTemplate 클래스를 사용합니다.
실제로 이 클래스를 사용.(SqlSessionTemplate)

그리고 datasource.xml을 contextConfigLocation의 param으로 추가해줍니다.
(그래야 project전역에서 datasource.xml이 적용됨.)

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
 <param-value>/WEB-INF/spring/datasource.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

4. mapper 만들기

먼저 mybatis mapper 파일을 쉽게 생성하게 도와주는 Eclipse Plugin을 설치한다.

Eclipse MarketPlace

MyBatipse를 설치한다.

MyBatipse를 설치하고 나면 Mapper file을 만들때, MyBatis라는 파일타입이 생성됩니다.
mapper는 MyBatis XML Mapper 형식으로 만들면 됩니다
src/resources/mappers/mydao-mapper.xml 을 만들어 줍니다.
그러면 다음과 같이 mapper파일이 자동으로 생성됩니다.

mapper는 DAO와 1:1로 만들어 주는것이 좋습니다.

<?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="mappers.mydao-mapper">
여기에 쿼리를 작성하면 된다.
</mapper>

5. mapper 등록

3번으로 돌아가, sqlSessionFactory bean의 mapperLocations의 list의 value에 mapper의 위치를 작성해 줍니다.

... 생략

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation" value="classpath:mybatis-config.xml" />
  <property name="mapperLocations">
    <list>
      <value>classpath:mappers/mydao-mapper.xml</value>
    </list>
  </property>
</bean>

... 생략

매퍼를 새로 생성할때마다, value를 추가해 주거나 wild-card를 사용하여 mapper를 등록하면 됩니다.

사용법 예시

ExampleDAO.java

package net.jwkim96.spring.dao;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import net.jwkim96.spring.vo.ExampleVO;

@Repository
public class ExampleDAO {

    @Autowired
    private SqlSession sqlSession;

    // 실제 파일 : mappers/example.xml
    // namespace: mappers.example.쿼리아이디
    private final String NAMESPACE = "mappers.example.";


    public ExampleVO selectTest() throws Exception {        
        return sqlSession.selectOne(NAMESPACE+"selectTest");
    }
}

mapper file (location : classpath:mappers/example.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="mappers.example">
    <select id="selectTest" resultType="net.jwkim96.spring.vo.ExampleVO">
        SELECT * FROM example LIMIT 1
    </select>
</mapper>

datasource.xml (location : src/main/webapp/WEB-INF/spring/datasource.xml)

<?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: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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <context:property-placeholder
        location="classpath:config/mysql-database.properties" />

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${db.driverClass}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation"
            value="classpath:mybatis-config.xml" />
        <property name="mapperLocations">
            <list>
                <value>classpath:mappers/example.xml</value>
            </list>
        </property>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory" />
    </bean>

</beans>

참고 : Spring JDBC를 이용한 데이터 접근 방법