Spring | 04 MyBatis와 스프링 연동

파과·2022년 9월 19일

MyBatis는 진입장벽이 낮은 편으로, JDBC의 대안으로 많이 사용된다.

라이브러리 추가

  • spring-jdbc
  • spring-tx (트랜잭션 처리)
  • mybatis
  • mybatis-spring
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.2</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>${org.springframework-version}</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${org.springframework-version}</version>
</dependency>

SQLSessionFactory

root-context.xml에 아래 코드 추가

<bean id="sqlsessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"></property>
</bean>

테스트

DataSourceTests에 코드를 추가해 테스트한다.

//...생략
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {

	@Setter(onMethod_ = { @Autowired })
	private DataSource dataSource;
	
	@Setter(onMethod_ = { @Autowired })
	private SqlSessionFactory sqlSessionFactory;
	
	@Test
	public void testMyBatis() {
		try(SqlSession session = sqlSessionFactory.openSession();
				Connection con = session.getConnection();
				){
			log.info(session);
			log.info(con);
		}catch(Exception e) {
			fail(e.getMessage());
		}
	}
//...생략

Mapper 인터페이스

org.zerock.mapper 패키지에 TimeMapper 인터페이스를 추가한다.

package org.zerock.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

	@Select("SELECT sysdate FROM dual")
	public String getTime();
}

MyBatis가 Mapper를 인식할 수 있도록 root-context.xml에 설정을 추가하자.

root-context.xml의 Namespaces탭에서 mybatis-spring을 추가한 뒤 아래 코드를 추가한다.

<mybatis-spring:scan base-package="org.zerock.mapper"/>

Mapper 테스트

org.zerock.persistence.TimeMapperTests.java

package org.zerock.persistence;

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 org.zerock.mapper.TimeMapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class TimeMapperTests {

	@Setter(onMethod_ = @Autowired)
	private TimeMapper timeMapper;
	
	@Test
	public void testGetTime() {
		log.info(timeMapper.getClass().getName());
		log.info(timeMapper.getTime());
	}
}

XML 매퍼와 같이 쓰기

src/main/resources 폴더에 순서대로 org, zerock, mapper 폴더를 만든다. (한번에 하나씩)
TimeMapper.xml파일을 생성한다.

기존 TimeMapper 인터페이스에 다음과 같이 추가로 메서드를 선언한다.

package org.zerock.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

	@Select("SELECT sysdate FROM dual")
	public String getTime();
	
	public String getTime2();
}

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="org.zerock.mapper.TimeMapper">

	<select id="getTime2" resultType="string">
		SELECT sysdate FROM dual
	</select>

</mapper>

테스트 생략.

log4jdbc-log4j2 설정

SQL 로그를 제대로 보기 위해 사용한다.

pom.xml에 다음 추가

<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
  <groupId>org.bgee.log4jdbc-log4j2</groupId>
  <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
  <version>1.16</version>
</dependency>

src/main/resources 밑에 log4jdbc.log4j2.properties 파일을 추가한다.

log4jdbc.log4j2.properties

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

root-context.xml의 일부를 다음과 같이 수정한다.

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
  <!-- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
  <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"></property> -->

  <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
  <property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl"></property>
  <property name="username" value="book_ex"></property>
  <property name="password" value="book_ex"></property>
</bean>

기존의 테스트 코드를 실행해본다.

로그 레벨 설정

로그가 상당히 많이 출력되어 불편하다고 느낄 경우 로그 레벨을 수정해준다.
log4j.xml에서 level value=warn으로 바꾸게 되면 info보다 높은 레벨의 로그만 기록된다.

0개의 댓글