MyBatis
MyBatis(http://www.mybatis.org/mybatis-3/)는 흔히 'SQL 매핑(mapping)' 프레임워크로 분류되는데, 개발자들은 JDBC 코드의 복잡하고 지루한 작업을 피하는 용도로 많이 사용한다.
MyBatis 관련 라이브러리 추가
MyBatis와 mybatis-spring을 사용하기 위해 pom.xml 파일에 추가적인 라이브러리들을 설정
// pom.xml
... (생략) ...
<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>
... (생략) ...
SQLSessionFactory
MyBatis에서 가장 핵심적인 객체는 SQLSession이라는 존재와 SQLSessionFactory이다.
root-context.xml에서 작성
// root-context.xml
<!-- HikariCP configuration -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
스프링에 SqlSessionFactory를 등록하는 작업은 SqlSessionFactoryBean을 이용한다.
패키지명을 보면 MyBatis의 패키지가 아니라 스프링과 연동 작업을 처리하는 mybatis-sprinf 라이브러리의 클래스임을 알수 있다.
SqlSessionFactoryBean을 이용해서 SqlSession을 사용해 보는 테스트는 기존의 DataSourceTests 클래스에 추가해서 확인한다.
DataSourceTests.java
// DataSourceTests.java
... (생략) ...
@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 testConnection() {
try (SqlSession session = sqlSessionFactory.openSession();
Connection con = session.getConnection(); ) {
log.info(session);
log.info(con);
} catch (Exception e) {
fail(e.getMessage());
}
}
}
스프링과의 연동 처리
Mapper는 쉽게 말해서 SQL과 그에 대한 처리를 지정하는 역할을 한다.
Mapper 인터페이스
// TimeMapper.java
package org.codehows.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
@Select("SELECT sysdate FROm dual")
public String getTime();
}
Mapper 설정
Mapper를 작성했으면 MyZBatis가 동작할 때 Mapper를 인식할 수 있도록 root-context.xml에 추가적인 설정이 필요
// root-context.xml
... (생략) ...
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<mybatis-spring:scan base-package="org.codehows.mapper"/>
<context:component-scan base-package="org.codehows.sample">
</context:component-scan>
Mapper 테스트
// TimeMapperTest.java
package org.codehows.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.codehows.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 매퍼와 같이 쓰기
// TimeMapper.java
package org.codehows.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.codehows.mapper.TimeMapper">
<select id="getTime2" resultType="string">
SELECT sysdate FROM dual
</select>
</mapper>
추가~
// TimeMapperTests.java
... (생략) ...
@Test
public void testGetTime2() {
log.info("getTime2");
log.info(timeMapper.getTime2());
}
}
log4jdbc-log4j2 설정
pom.xml 라이브러리 추가설정
추가
<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의 일부
// 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:XE"></property>
-->
<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>
... (생략) ...
로그의 레벨 설정
// log4j.xml
<logger name="jdbc.audit">
<level value="warn" />
</logger>
<logger name="jdbc.resultset">
<level value="warn" />
</logger>
<logger name="jdbc.connection">
<level value="warn" />
</logger>
<!-- Root Logger -->
<root>
<priority value="info" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
'Spring' 카테고리의 다른 글
스프링 - Part 2 - 스프링 MVC 설정 02 (2) | 2023.03.21 |
---|---|
스프링 - Part 2 - 스프링 MVC 설정 01 (0) | 2023.03.21 |
스프링 - Part 1 - 스프링 개발환경 구축 (1.개발을 위한 준비, 2.스프링의 특징과 의존성 주입, 3.스프링과 Oracle Database 연동) (0) | 2023.03.20 |
스프링 웹 프로젝트 MVC - 책 목록 만들기, 책 검색 기능 추가하기 07 (2) | 2023.03.17 |
스프링 웹 프로젝트 MVC - 책 삭제 기능 만들기 06 (0) | 2023.03.17 |