본문 바로가기

Spring

mybatis와 스프링 연동 예제

mybatis

SQL 매핑프레임워크로 개발자들은 JDBC코드의 복잡하고 지루한 작업을 피하는 용도로 사용합니다.

JDBC(DB에 접근 가능하게 Java에서 제공하는 API) 코드를 직접 작성하면 Connection을 선언 후 close 처리, PreparedStatement 직접 생성 및 처리, ResultSet을 통한 쿼리 처리 등 복잡하고 반복적인 코드를 작성할 수 밖에 없습니다. 이러한 SQL에 대한 쿼리 부분을 포함하여 모든 컨트롤을 자동처리로 도와주는 프레임워크를 말합니다.

 

1. mybatis 관련 라이브러리


1-1. mybatis와 mybatis-spring을 사용하기 위해 pom.xml 파일에 라이브러리를 설정

  • spring-jdbc/spring-tx

    • 스프링에서 DB처리와 트랜잭션 처리를 위해 선언

  • mybatis/mybatis-spring

    • mybatis와 spring을 연동

<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.4.6</version>
</dependency>

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

 

 

1-2. SQLSessionFactory 추가

mybatis에서 가장 핵심 객체는 SQLSession과 SQLSessionFactory라는 것입니다.

SessionFactory는 내부적으로 SQLSession을 만들어 내는 기능을 하며 개발에선 connection을 생성하거나 원하는 sql을 전달 후 결과를 리턴받는 구조로 작성합니다.

 

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

 

 

1-3. Spring과 연동

SQLConnectionFactory를 이용해 JDBC를 작성 가능하지만 SQL의 처리 설정을 분리하여 자동처리하는 방식이 더 효율적이기 때문에 이 방법을 사용하도록 하겠습니다. 이러한 방법을 이용하기 위해선 Mapper라는 파일을 생성하고 작성하여 처리 할 수 있습니다.

Mapper.xml을 작성시 파일의 위치와 xml파일에 지정하는 namespaces 속성이 중요하며 mapper를 생성시 저장할 디렉토리 구조는 가능하다면 mapper 인터페이스와 같은 이름을 사용하는게 좋습니다.

아래와 같은 인터페이스를 생성해줍니다.

 

package org.zerock.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	//mapper 없이 @어노테이션을 이용한 sql 작성
	//@Select("SELECT sysdate FROM dual")
	//public String getTime();
	
	//mapper.xml 에 sql 작성
	public String getTime2();
}

 

root-context.xml 파일 내용 안에 다음을 추가합니다.

 

<!-- mybatis 설정의 지정된 패키지의 모든 어노테이션을 찾아 설정하는 것을 의미한다. -->
	<mybatis-spring:scan base-package="org.zerock.mapper"/>

 

이후 SQL을 작성할 xml파일을 src/main/resources/org/zerock/mapper/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>

 

  • namespace : mapper 인터페이스의 이름과 속성값을 확인

  • id : 해당 인터페이스의 메소드 이름과 매칭

  • resultType : SQL select 쿼리의 리턴타입

인터페이스내 메소드 선언에 대한 SQL 처리는 xml 파일로 처리하는 방식

 

1-4. log4jdbc 설정

실행된 SQL의 전체 내용을 확인하기 위해선 log4jdbc 를 사용해야 합니다.

pom.xml에 다음과 같은 라이브러리를 추가합니다.

<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>	

 

이후 src/main/resources 경로 내에 log4jdbc.log4j2.properties 파일을 추가하고 다음과 같은 내용을 입력합니다.

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

 

log4jdbc를 사용하는 경우 JDBC드라이버와 URL 정보를 수정해야 하기 때문에 root-context.xml 을 다음과 같이 수정합니다.

(저는 커넥션 풀을 hikariConfig 로 설정하였습니다. )

 

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
		<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"></property>
		<property name="username" value="book_ex"></property>
		<property name="password" value="book_ex"></property>
	</bean>

 

1-5. 테스트 코드 작성

 

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 {

		@Autowired
		@Setter
		private TimeMapper timeMapper;
				
		@Test
		public void testGetTime2() {
			
			log.info("getTime2()");
			log.info(timeMapper.getTime2());
		}
		
}

 

결과


INFO : jdbc.sqltiming - SELECT sysdate FROM dual 
 {executed in 1 msec}
INFO : jdbc.audit - 1. PreparedStatement.execute() returned true
INFO : jdbc.resultset - 1. ResultSet.new ResultSet returned 
INFO : jdbc.audit - 1. PreparedStatement.getResultSet() returned net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy@54a67a45
INFO : jdbc.resultset - 1. ResultSet.getMetaData() returned oracle.jdbc.driver.OracleResultSetMetaData@7d42c224
INFO : jdbc.resultset - 1. ResultSet.getType() returned 1003
INFO : jdbc.resultset - 1. ResultSet.next() returned true
INFO : jdbc.resultset - 1. ResultSet.getString(SYSDATE) returned 2019-04-30 06:33:33.0
INFO : jdbc.resultset - 1. ResultSet.wasNull() returned false
INFO : jdbc.resultsettable - 
|----------------------|
|sysdate               |
|----------------------|
|2019-04-30 06:33:33.0 |
|----------------------|

 

 

참고

코드로 배우는 스프링 웹프로젝트

'Spring' 카테고리의 다른 글

Spring @Annotation 종류와 이해  (0) 2019.05.17
스프링 MVC 기본구조  (0) 2019.05.01
IntelliJ로 스프링 gradle 프로젝트 설정  (0) 2019.04.28
Spring 의 특징과 의존성  (0) 2019.04.25