Spring

스프링 - Part 1 - 스프링 개발환경 구축(4.MyBatis와 스프링 연동)

록's 2023. 3. 21. 09:42
728x90
반응형

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>

 

 

728x90
반응형