본문 바로가기

IT공부/스프링

MyBatis 연동

MyBatis 연동

pom.xml에 아래와 같이 의존성 설정을 한다. mybatis-spring은 스프링과 mybatis를 연결해주는 역할을 한다. spring-test는 mybatis 연결 테스트를 할 때 사용한다.

 

<dependency>

       <groupId>org.mybatis</groupId>

       <artifactId>mybatis</artifactId>

       <version>3.4.1</version>

</dependency>

 

<dependency>

       <groupId>org.mybatis</groupId>

       <artifactId>mybatis-spring</artifactId>

       <version>1.3.0</version>

</dependency>

 

<dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-jdbc</artifactId>

       <version>${org.springframework-version}</version>

</dependency>

 

<dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-test</artifactId>

       <version>${org.springframework-version}</version>

</dependency>

 

위와 같이 작성하고 저장하면 라이브러리를 다운로드한다. 다운로드가 완료되면 root-context.xml에 작성할 수 있는 태그가 추가된다. root-context.xml은 웹 자원과 관련되지 않은 모든 설정을 한다. 웹과 관련된 설정은 appServlet 폴더 안에 있는 servlet-context.xml이 한다.

root-context.xml에서 Namespace 탭을 선택한 뒤 아래와 같이 네임스페이스를 추가해준다(네임스페이스는 xml에 작성할 수 있는 태그의 범위를 넓혀준다고 생각하면 된다.)

네임스페이스를 추가하면 아래와 같이 XML 네임스페이스가 추가된 것을 확인할 수 있다.

servlet-root.xml에 아래와 같이 JDBC 연결 정보를 작성해준다. class 속성에 'org.springframework.jdbc.xxx'라고 되어있는 부분은 위에서 pom.xml에 의존 설정을 한 spring-jdbc 모듈을 추가해주어서 사용이 가능한 것이다. 

 

<bean id="dataSource"

  class="org.springframework.jdbc.datasource.DriverManagerDataSource">

 

<property name="driverClassName"

               value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>

              

<property name="url"

               value="jdbc:log4jdbc:mysql://127.0.0.1:3306/book_ex?useSSL=false"></property>

              

<property name="username" value="admin"></property>

<property name="password" value="121314"></property>

 

스프링은 설정이 하나만 잘못되도 실행이 안되는 경우가 많기 때문에 설정이 변경되었다면 바로 테스트를 진행하는 것이 좋다. 위에서 추가한 spring-test모듈은 jUnit에서 WAS를 구동시키지 않고도 테스트를 할 수있게 해준다. 

 

src/test/java 폴더에 아래와 같이DataSourceTest를 생성한다.

 

package org.project.web;

 

import java.sql.Connection;

 

import javax.inject.Inject;

import javax.sql.DataSource;

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(

       locations ={"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})

public class DataSourceTest {

 

       @Inject

       private DataSource ds;

      

       @Test

       public void testConection()throws Exception{

              

               try(Connection con = ds.getConnection()){

                     

                      System.out.println(con);

                     

               }catch(Exception e){

                      e.printStackTrace();

               }

       }

}

 

@RunWith(SpringJUnit4ClassRunner.class)과 @ContextConfiguration은 테스트 코드 실행시 스프링이 로딩되도록 하는 설정이다. @ContextConfiguration 괄호안에 설정한 xml 설정파일을 읽어들여 스프링을 로딩한다. @Inject는 root-context.xml에서 설정한 DataSource빈을 주입시킨다.

 

테스트를 해본다.


※ 아래와 같이 에러가 나면서 실행이 안된다면 다음 방법으로 시도한다.

WARN : org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [C:\newproject\ex00\src\main\webapp\WEB-INF\spring\root-context.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:

 

해당 현상은 log4jdbc(Mybatis 로그를 자세히 볼 수 있다.) 사용하기 위한 DriverManagerDataSource 클래스의 dataSource를 빈으로 생성하지 못하는 현상이다. 해결방법은 아래와 같다.

 

src/main/resources 밑에 아래와 같이 파일을 생성한다.

 

파일안에 아래와 같이 작성한다.

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

logback.xml 파일은 아래와 같이 작성한다.

 

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <include resource="org/springframework/boot/logging/logback/base.xml"/>

 

    <!-- log4jdbc-log4j2 -->

       <logger name="jdbc.sqlonly"        level="DEBUG"/>

    <logger name="jdbc.sqltiming"      level="INFO"/>

    <logger name="jdbc.audit"          level="WARN"/>

    <logger name="jdbc.resultset"      level="ERROR"/>

    <logger name="jdbc.resultsettable" level="ERROR"/>

    <logger name="jdbc.connection"     level="INFO"/>

</configuration>

 

 

pom.xml에 아래와 같이 의존성 설정을 한다.

 

<dependency>

           <groupId>org.bgee.log4jdbc-log4j2</groupId>

           <artifactId>log4jdbc-log4j2-jdbc4</artifactId>

           <version>1.16</version>

</dependency>


spring-test 모듈과 어노테이션을 사용하면 WAS를 구동시키지 않아도 빠르게 테스트를 할 수 있다. 

 

로그들을 보면 Connection 객체가 생성되는 것을 확인할 수 있다.

 

MyBatis와 MySQL 연동

DataSource를 통해 스프링과 MySQL 연결 테스트를 했다. 그 다음으로 MyBatis와 MySQL을 연동시킨다. 스프링에서는 하나의 설정만 잘못되도 실행이 되지 않기 때문에 하나씩 테스트하는 습관을 들여야한다. DataSource 테스트 역시 MyBatis와 MySQL 연동 테스트 전에 선행되어야 한다.

 

MyBatis와 MySQL 연동을 위해서는 스프링에서 MyBatis를 사용하기 위한 연동작업이 필요하다. 이를 위해서는 SqlSessionFactory가 필요하다. SqlSessionFactory는 DataSource를 필요로하며 실질적으로 MySQL과의 연결과 Sql 실행에 관련된 모든 것을 가진다. SqlSessionFactory를 사용하기 위해서는 SqlSessionFactoryBean을 사용한다. SqlSessionFactoryBean은 SqlSessionFactory 빈을 생성해주는 역할을 한다. SqlSessionFactoryBean으로 SqlSessionFactory를 생성하기 위해서는 root-context.xml에 SqlSessionFactoryBean을 아래와 같이 추가한다.

 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

           <property name="dataSource" ref="dataSource" />

</bean>

 

위 설정에서 org.mybatis.spring.xxx 클래스를 사용하기 위해서는 MyBatis-spring 모듈을 추가해줘야만 사용이 가능하다.

MyBatis 설정파일 추가

MyBatis는 SQL Mapping 프레임워크로서 별도의 설정파일을 가질 수 있다. 스프링과 설정 파일과 별개이다.

 

아래와 같이 src/main/resources 밑에 mybatis-config.xml 파일을 추가한다.

mybatis 설정파일을 만들 때 중요한 것은 아래와 같은 형식을 지켜줘야 작동이 된다는 점이다. 

 

<?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>

 

위 설정파일이 스프링이 구동될 때 같이 구동되게 하기 위해 root-context.xml에 아래와 같이 추가한다.

 

<property name="configLocation"

                              value="classpath:/mybatis-config.xml"></property>

MyBatis 연결 테스트

모든 설정이 끝났으면 마지막으로 스프링에서 MyBatis와 MySQL 연결 테스트를 한다. 

 

아래와 같이 MyBatisTest를 추가하여 테스트해본다.

 

package org.project.web;

 

import javax.inject.Inject;

 

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(

       locations ={"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})

public class MyBatisTest {

 

       @Inject

       private SqlSessionFactory sqlFactory;

      

       @Test

       public void testFactory(){

              

               System.out.println(sqlFactory);

              

       }

      

       @Test

       public void testSession()throws Exception{

              

               try(SqlSession session = sqlFactory.openSession()){

                     

                      System.out.println(session);

                     

               }catch(Exception e){

                      e.printStackTrace();

               }

              

       }

}

 

아래와 같은 메시지가 나오면 테스트를 성공한 것이다.

 

스프링에서 MyBatis 연동설정과 MySQL 연결 테스트까지 완료했다.

 

이번 글에서 중요한 것은 테스트의 중요성이다. 테스트의 위력은 유지보수를 하거나 코드를 하나로 통합하는 과정에서 들어난다.

 

'IT공부 > 스프링' 카테고리의 다른 글

스프링에서 MyBatis 사용하기  (0) 2020.07.04
스프링 MVC  (0) 2020.07.04
MySQL 연결 테스트  (0) 2020.07.03
MySQL 설치  (0) 2020.07.03
개발환경설정  (0) 2020.07.03