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 |