Spring MVC - MyBatis 설정 및 테스트

 

본 포스팅은 코드로 배우는스프링 웹프로젝트를 참조하여 작성한 내용입니다. 개인적으로 학습한 내용을 복습하기 위해 기록한 내용이기 때문에 오류가 있다면 지적 부탁드리겠습니다.

포스팅의 예제는 STS 또는 Eclipse를 사용하지 않고 IntelliJ를 통해 구현하고 있습니다. 그래서 기존의 STS에서 생성된 Spring 프로젝트의 스프링관련 설정 파일명과 프로젝트 구조가 약간 다를 수 있습니다. IntelliJ를 통한 Spring MVC 프로젝트 생성 포스팅을 참고해주시면 감사하겠습니다.

현재 프로젝트의 전체코드는 Github 저장소에서 확인하실 수 있습니다.


1. MyBtis의 장점 간단 요약

  • 간결한 코드처리 : JDBC작업을 위한 반복적인 코드(try~cathch~finally, PreparedStatement, ResultSet)를 직접 작성하지 않아도 된다.
  • SQL문 분리 운영 : XML 또는 애너테이션 방식으로 SQL문을 별도로 처리하는 작업이 가능하다.
  • Spring과 연동으로 자동화된 처리 : MyBatis-Spring라이브러리를 이용하여 직접 SQL문 호출없이도 원하는 결과를 얻을 수 있다.
  • 동적 SQL을 이용한 제어기능 : 제어문이나 반복문 등의 처리 기능을 통해 SQL과 관련된 처리를 Java코드에서 분리할 수 있다.

2. MyBatis 연동을 위한 설정

pom.xml에 JDBC, Mybatis관련 라이브러리를 추가해준다.

<!--Spring-Jdbc 라이브러리-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<!--Spring-Test 라이브러리-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<!--MyBatis 라이브러리-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.1</version>
</dependency>
<!--MyBatis-Spring 라이브러리-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>

applicationContext.xml에 DataSource 설정을 작성해준다.

<!--DataSource 설정-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring_ex?useSSL=false"/>
    <property name="username" value="아이디"/>
    <property name="password" value="비밀번호"/>
</bean>

3. DataSource 테스트

test/java/하위패키지에 아래와 같이 테스트 코드 작성해준다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/applicationContext.xml"})
public class DataSourceTest {

    @Inject
    private DataSource dataSource;

    @Test
    public void testConnection() throws Exception {
        try(Connection connection = dataSource.getConnection()) {
            System.out.println(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

테스트 코드를 실행시켜 정상적으로 테스트가 완료되면 콘솔에 아래와 같이 출력된다.

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [file:src/main/webapp/WEB-INF/spring/applicationContext.xml]
INFO : org.springframework.context.support.GenericApplicationContext - Refreshing org.springframework.context.support.GenericApplicationContext@4b4523f8: startup date [Wed Nov 22 21:29:37 KST 2017]; root of context hierarchy
INFO : org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
com.mysql.jdbc.JDBC4Connection@77847718
INFO : org.springframework.context.support.GenericApplicationContext - Closing org.springframework.context.support.GenericApplicationContext@4b4523f8: startup date [Wed Nov 22 21:29:37 KST 2017]; root of context hierarchy

4. Mybatis 연결 설정

applicationContext.xml에 SqlSessionFactory 객체를 설정해준다.

<!--SqlSessionFactory 설정 : dataSource를 참조, mybatis-config.xml 경로설정-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:/mybatis-config.xml"/>
</bean>

mybatis-config.xml은 MyBatis 설정파일로 src/main/resources 디렉토리에 xml파일 생성한 뒤 아래와 같이 작성한다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

5. MyBatis 연결 테스트

test/java/하위패키지에 아래와 같이 테스트 코드를 작성해준다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/applicationContext.xml"})
public class MyBatisTest {

    @Inject
    private SqlSessionFactory sqlSessionFactory;

    @Test
    public void testFactory() {
        System.out.println(sqlSessionFactory);
    }

    @Test
    public void testSession() throws Exception {
        try(SqlSession session = sqlSessionFactory.openSession()) {
            System.out.println(session);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

테스트 코드를 실행시켜 정상적으로 테스트가 완료되면 콘솔에 아래와 같이 출력된다.

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [file:src/main/webapp/WEB-INF/spring/applicationContext.xml]
INFO : org.springframework.context.support.GenericApplicationContext - Refreshing org.springframework.context.support.GenericApplicationContext@6325a3ee: startup date [Wed Nov 22 22:57:50 KST 2017]; root of context hierarchy
INFO : org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@26794848
org.apache.ibatis.session.defaults.DefaultSqlSession@1ff4931d
INFO : org.springframework.context.support.GenericApplicationContext - Closing org.springframework.context.support.GenericApplicationContext@6325a3ee: startup date [Wed Nov 22 22:57:50 KST 2017]; root of context hierarchy