Spring

[Spring] MariaDB + HikariCP + MyBatis 설정하기

coding-knowjam(코딩노잼) 2020. 12. 20.
728x90

안녕하세요~ coding-knowjam입니다.

오늘은 Spring + MyBatis + MariaDB 조합으로 설정하는 방법에 대해서 포스팅해보겠습니다.

 

외부 라이브러리는 관리 도구는 Maven을 사용하였고 버전은 다음과 같습니다.

Library Version Purpose
spring-xxx 5.0.7 Spring Project
mariadb-java-client 2.6.2 MariaDB 연결
mybatis 3.4.6 MyBatis 연결
mybatis-spring 1.3.2
HikariCP 3.4.5 DB ConnectionPool
log4jdbc-log4j2-jdbc4 1.16 SQL질의 결과 log기록

 

 

1. Spring + MariaDB

먼저 Spring MVC프로젝트에 MariaDB를 연결해보겠습니다.

pom.xml에 아래와 같이 mariadb-java-client를 추가해주세요.

<!-- MariaDB JDBC  -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.6.2</version>
</dependency>

 

테스트 코드를 통해 연결이 정상적으로 되는지 확인해보겠습니다. (Junit 4.12 버전)

Connection객체를 얻을 때 전달하는 파라미터의 url형식은 다음과 같습니다.

"jdbc:mariadb://IP:포트번호/데이터베이스명?user=유저명&password=유저비밀번호"
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import org.junit.Test;


public class MariaDBConnectionTest {
	
	private static final Logger log = Logger.getLogger(MariaDBConnectionTest.class);
    	String url ="jdbc:mariadb://localhost:3306/test_database?user=root&password=root";
	
	@Test
	public void connectionTest() {
		try {
			Class.forName("org.mariadb.jdbc.Driver");
			Connection connection = DriverManager.getConnection(url);
			log.info("### connection : " +  connection + " - 연결 성공 ####");
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

코드 작성 후 실행하면 다음과 같은 로그가 찍힙니다.

MariaDB Connection Success Log

 

1.1 MariaDB Connector 참고사항

테스트 코드 작성을 위해 MariaDB Connector관련 공식문서를 참조해보니, Class.forName("org.mariadb.jdbc.Driver") 코드를 생략 가능하더라고요.

어느 버전부터 지원하는지는 문서에서 못 찾았지만, DriverManager.getConnection(url) 코드가 실행되면 자동으로 Driver가 load가 된다고 합니다.

즉 아래와 같이 코드를 작성해도 동일한 로그가 찍히는 것을 볼 수 있습니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import org.junit.Test;


public class MariaDBConnectionTest {
	
	private static final Logger log = Logger.getLogger(MariaDBConnectionTest.class);
    	String url ="jdbc:mariadb://localhost:3306/test_database?user=root&password=root";
	
	@Test
	public void connectionTest() {
		try {
			// Class.forName("org.mariadb.jdbc.Driver"); 주석처리 가능 
			// 자동으로 JDBC드라이버를 호출함(현재 버전2.6.2, 최소 지원 버전은 잘 모르겠음)
			Connection connection = DriverManager.getConnection(url);
			log.info("### connection : " +  connection + " - 연결 성공 ####");
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

 

 

2. Spring + MariaDB + HikariCP

코드에서 쿼리를 실행하기 위해서는 DB와 Connection을 맺어야 하는데 쿼리를 실행할 때마다 Connection을 맺으면 비 효율적이므로, 일반적으로 Connection Pool을 이용해서 Connectoin을 관리하게 됩니다.

Connection Pool에 대한 이론적인 내용은 차후에 다시 포스팅하기로 하고, 요즘 많이 사용하는 HikariCP(히카리 커넥션 풀)를 통해서 설정해보겠습니다.

 

HikariCP를 사용하기 위해 pom.xml에 아래와 같이 의존성을 추가합니다.

<!-- HikariCP -->
<dependency>
	<groupId>com.zaxxer</groupId>
	<artifactId>HikariCP</artifactId>
	<version>3.4.5</version>
</dependency>

 

Java에서는 DataSource인터페이스를 통해 Connection Pool을 사용합니다.

HikariCP에서는 DataSource인터페이스를 구현한 HikariDataSource클래스가 있고, 이를 사용하기 위해 bean으로 등록해주겠습니다.

등록하는 방법은 java와 xml 방식이 있으며, xml방식부터 알아보겠습니다.

 

2.1 XML 설정 방식

1번 항목에서 테스트했던 MariaDB연결 정보를 root-context.xml(SpringCore설정 파일)에 아래와 같이 작성합니다.

<!--  HikariCp Config -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
	<property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/test_database"></property>
	<property name="username" value="root"></property>
	<property name="password" value="root"></property>
</bean>
	
<!-- HikariDataSource -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
	<constructor-arg ref="hikariConfig" />
</bean>

 

2.2 Java코드 설정 방식

1번 항목에서 테스트했던 MariaDB연결 정보를 RootConfig.java(SpringCore설정 파일)에 아래와 같이 작성합니다.

import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
public class RootConfig {

	@Bean
	public DataSource datasource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver");
		hikariConfig.setJdbcUrl("jdbc:mariadb://localhost:3306/test_database");
		hikariConfig.setUsername("root");
		hikariConfig.setPassword("root");
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}
}

 

bean으로 등록된 dataSource객체를 사용해서 정상적으로 Connection을 처리할 수 있는지 테스트하기 위해 아래와 같이 테스트 코드를 작성합니다.

import static org.junit.Assert.fail;
import java.sql.Connection;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
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 com.nojam.coding.config.RootConfig;

//xml설정방식 사용 시
//@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

//java설정방식 사용 시
@ContextConfiguration(classes = {RootConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class HikariDataSourceTest {

	private static final Logger log = Logger.getLogger(HikariDataSourceTest.class);

	@Autowired
	private DataSource dataSource;
	
	@Test
	public void hikariDataSourceTest() {
		try {
			Connection con = dataSource.getConnection();
			log.info("'Connection객체 : " + con + "'");
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
}

 

코드를 실행 후 정상적으로 Connection객체가 생성되면 아래와 같은 로그가 찍힙니다.

HikariCP Connection Success Log

 

 

3. Spring + MariaDB + HikariCP + MyBatis

이제 MyBatis를 설정해보겠습니다.

pom.xml에 아래와 같이 4개의 의존성을 추가합니다.

하나라도 빠지면 에러가 날 수 있으니까 모두 추가해주세요.

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
		  
<!-- mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>
		
<!-- spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.7</version>
</dependency>
				
<!-- spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.7</version>
</dependency>

 

MyBatis는 SqlSessionFactory를 통해서 SqlSession객체를 생성하고 이를 통해 Connection을 얻을 수 있습니다.

SqlSessionFactory를 사용하기 위해서 bean으로 등록해주겠습니다.

 

3.1 XML 설정 방식

2.1 항목에서 설정한 xml파일에 이어서 설정해주시면 됩니다.

<!-- 2번항목에서 설정한 HikariCp Config -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
	<property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/test_database"></property>
	<property name="username" value="root"></property>
	<property name="password" value="root"></property>
</bean>
	
<!-- 2번 항목에서 설정한 HikariDataSource -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method ="close">
	<constructor-arg ref="hikariConfig" />
</bean>

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

 

3.2 Java코드 설정 방식

2.2 항목에서 설정한 java파일에 이어서 설정하시면 됩니다.

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
public class RootConfig {

	// 2번 항목에서 설정한 Hikari DataSource
	@Bean
	public DataSource datasource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver");
		hikariConfig.setJdbcUrl("jdbc:mariadb://localhost:3306/test_database");
		hikariConfig.setUsername("root");
		hikariConfig.setPassword("root");
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}
	
	// SqlSessionFactory
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
		sqlSessionFactory.setDataSource(datasource());
		return sqlSessionFactory.getObject();
	}
}

 

SqlSessionFactory가 정상적으로 bean으로 등록되었는지 테스트 코드를 통해 확인해보겠습니다.

아래와 같이 작성해 주세요.

import static org.junit.Assert.fail;
import java.sql.Connection;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
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 com.nojam.coding.config.RootConfig;

//xml설정방식 사용 시
//@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

//java설정방식 사용 시
@ContextConfiguration(classes = {RootConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class SqlSessionTest {
	
	private static final Logger log = Logger.getLogger(SqlSessionTest.class);
	
	@Autowired
	private SqlSessionFactory sqlSessionFactory;
	
	@Test
	public void sqlSessionFactoryTest() {
		try {
			SqlSession session = sqlSessionFactory.openSession();
			Connection connection = session.getConnection();
			log.info("'Session 객체 : " + session + "'");
			log.info("'Connection 객체 : " + connection + "'");
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
}

 

SqlSession과 Connection객체가 정상적으로 만들어지면 다음과 같이 log가 기록됩니다.

SqlSessionFactory Connection Success Log

 

3.3 MyBatis 사용법

MyBatis설정까지 완료했으니 사용법을 간단하게 정리하겠습니다.

일반적으로 Java의 interface + xml 조합으로 사용을 하며, 파일의 이름은 대체적으로 ***Mapper.java, ***Mapper.xml 형태로 만들어 줍니다.

우선 적당한 위치에 Package를 생성하고 아래와 같이 Interface를 하나 만들어 주겠습니다.

public interface TestMapper {
}

 

interface에 현재 시간을 가져오는 method를 작성해주겠습니다.

public interface TestMapper {
	public String getTime(); 
}

 

생성한 Mapper는 MyBatis가 실행될 때 인식할 수 있도록 설정 파일에 추가적인 설정이 필요합니다.

 

3.3.1 XML 설정 방식

3.1 항목에서 사용한 xml파일에 <mybatis-spring ~~~ />를 추가합니다.

<!-- 2번 항목에서 설정한 HikariCp Config -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
	<property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/test_database"></property>
	<property name="username" value="root"></property>
	<property name="password" value="root"></property>
</bean>
	
<!-- 2번 항목에서 설정한 HikariDataSource -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method ="close">
	<constructor-arg ref="hikariConfig" />
</bean>

<!-- 3.1번 항목에서 설정한 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- Mybatis Mapper Interface Path -->
<mybatis-spring:scan base-package="매퍼파일이 있는 패키지 풀경로 ex)com.nojam.coding.mapper" />

 

3.3.2 Java코드 설정 방식

3.2 항목에서 사용한 java파일에 이어서 @MapperScan 어노테이션을 추가합니다.

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.mybatis.spring.annotation.MapperScan;

@MapperScan(basePackages = {"매퍼파일이 있는 패키지 풀경로 ex)com.nojam.coding.mapper"})
@Configuration
public class RootConfig {

	// 2번 항목에서 설정한 Hikari DataSource
	@Bean
	public DataSource datasource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver");
		hikariConfig.setJdbcUrl("jdbc:mariadb://localhost:3306/test_database");
		hikariConfig.setUsername("root");
		hikariConfig.setPassword("root");
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}
	
	// 3.2번 항목에서 설정한 SqlSessionFactory
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
		sqlSessionFactory.setDataSource(datasource());
		return sqlSessionFactory.getObject();
	}
}

 

이제 실제 쿼리가 작성될 xml파일을 만들겠습니다.

xml파일의 위치는 src/main/resources/mappers의 하위 디렉터리 안에 아래와 같이 생성해줍니다.

<select> 태그의 id속성의 값은 Mapper에 작성한 method의 이름과 동일해야 합니다.

<select> 태그의 resultType속성의 값은 Mapper에 작성한 method의 리턴 타입을 적어주면 됩니다.

<select> 태그 안에 현재 시간을 불러오는 SQL을 작성해 줍니다.

<?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="매퍼 풀 경로 ex)com.nojam.coding.mapper.TestMapper">
  <select id="getTime" resultType="String">
   	SELECT NOW()
  </select>
</mapper>

 

xml파일 작성이 완료되었으면 매퍼의 경로를 설정했던 것처럼 매퍼 xml의 경로도 추가적으로 설정해주어야 합니다.

 

3.3.3 XML 설정 방식

3.3.1 항목 설정에 이어서 SqlSessionFactory bean태그 안에 mapperLocation속성을 추가해줍니다.

<!-- 2번 항목에서 설정한 HikariCp Config -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
	<property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/test_database"></property>
	<property name="username" value="root"></property>
	<property name="password" value="root"></property>
</bean>
	
<!-- 2번 항목에서 설정한 HikariDataSource -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method ="close">
	<constructor-arg ref="hikariConfig" />
</bean>

<!-- 3.1번 항목에서 설정한 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<property name="mapperLocations" value ="classpath:mappers/*.xml" />
</bean>

<!-- 3.3.1번 항목에서 설정한 Mybatis Mapper Interface Path -->
<mybatis-spring:scan base-package="매퍼파일이 있는 패키지 풀경로 ex)com.nojam.coding.mapper" />

 

3.3.4 Java코드 설정 방식

3.3.3 항목 설정에 이어서 sqlSessionFactory() 안에 setMapperLocations() 메서드를 추가합니다.

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@MapperScan(basePackages = {"매퍼파일이 있는 패키지 풀경로 ex)com.nojam.coding.mapper"})
@Configuration
public class RootConfig {

	// 2번 항목에서 설정한 Hikari DataSource
	@Bean
	public DataSource datasource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver");
		hikariConfig.setJdbcUrl("jdbc:mariadb://localhost:3306/test_database");
		hikariConfig.setUsername("root");
		hikariConfig.setPassword("root");
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}
	
	// 3.2번 항목에서 설정한 SqlSessionFactory
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
		sqlSessionFactory.setDataSource(datasource());
		sqlSessionFactory.setMapperLocations(
        		new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));
		return sqlSessionFactory.getObject();
	}
}

 

이제 등록된 매퍼와 매퍼 xml이 정상적으로 설정되었는지 확인하기 위해 테스트 코드를 작성하겠습니다.

import org.apache.log4j.Logger;
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 com.nojam.coding.config.RootConfig;
import com.nojam.coding.mapper.TestMapper;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class})
public class MapperTest {
	
	private static final Logger log = Logger.getLogger(MapperTest.class);
	
	@Autowired
	private TestMapper testMapper;
	
	@Test
	public void getTime() {
		log.info("'현재 시각 : " + testMapper.getTime()+"'");
	}
}

 

테스트 코드를 실행하면 다음과 같이 현재 시각이 찍힌 로그를 볼 수 있습니다.

Mapper Test Log

 

MyBatis를 사용하는 방법 중에 어노테이션을 통해서 select쿼리를 작성하는 방법도 있습니다.

Mapper에 아래와 같이 getTime2()를 추가해주고 그 위에 @Select("SELECT NOW()")를 붙여주겠습니다.

public interface TestMapper {
	public String getTime(); 
    
    @Select("SELECT NOW()")
	public String getTime2();
}

 

Mapper에 추가된 메서드를 테스트해보겠습니다. 아래와 같이 작성해주세요.

import org.apache.log4j.Logger;
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 com.nojam.coding.config.RootConfig;
import com.nojam.coding.mapper.TestMapper;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class})
public class MapperTest {
	
	private static final Logger log = Logger.getLogger(MapperTest.class);
	
	@Autowired
	private TestMapper testMapper;
	
	@Test
	public void getTime() {
		log.info("'getTime() : " + testMapper.getTime()+"'");
		log.info("'getTime2() : " + testMapper.getTime2()+"'");
	}
}

 

실행하면 아래와 같이 정상적으로 실행된 로그를 볼 수 있습니다.

Mapper Test Log2

parameter를 넘기거나 resultType을 사용하는 방법 등등은 공식문서를 참조하시길 바랍니다.~

 

 

4. Spring + MariaDB + HikariCP + MyBatis + log4jdbc-log4j2

log4jdbc-log4j2는 설정하셔도 되고 안 하셔도 되지만 로그를 보시기에는 하는 게 편하기 때문에 하는 걸 추천드립니다.

log4jdbc-log4j2를 사용하면 쿼리의 질의 결과를 로그에서 확인할 수 있습니다.

 

pom.xml에 log4jdbc-log4j2-jdbc4 의존성을 추가해주세요.

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

 

log4jdbc-log4j2를 사용하기 위해서는 기존의 DB정보를 바꿔줘야 하므로 설정 파일을 수정해보겠습니다.

 

4.1 XML 설정 방식

hikariConfig bean태그 안에 기존의 Driver와 jdbcUrl속성을 주석처리 후에 아래와 같이 value값을 수정해주세요.

<!-- 2번 항목에서 설정한 HikariCp Config -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
	
    <!-- 기존 Driver정보 주석처리
    <property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/test_database"></property>
    -->
    
    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
	<property name="jdbcUrl" value="jdbc:log4jdbc:mariadb://localhost:3306/test_database"></property>
	<property name="username" value="root"></property>
	<property name="password" value="root"></property>
</bean>
	
<!-- 2번 항목에서 설정한 HikariDataSource -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method ="close">
	<constructor-arg ref="hikariConfig" />
</bean>

<!-- 3.1번 항목에서 설정한 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
    <!-- 3.3.3번 항목에서 설정한 mapperLocation -->
	<property name="mapperLocations" value ="classpath:mappers/*.xml" />
</bean>

<!-- 3.3.1번 항목에서 설정한 Mybatis Mapper Interface Path -->
<mybatis-spring:scan base-package="매퍼파일이 있는 패키지 풀경로 ex)com.nojam.coding.mapper" />

 

4.2 Java코드 설정 방식

dataSource() 안에 기존의 Driver와 jdbcUrl setter메서드를 주석처리 후에 아래와 같이 수정해주세요.

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

// 3.3.2번 항목에서 설정한 @MapperScan
@MapperScan(basePackages = {"매퍼파일이 있는 패키지 풀경로 ex)com.nojam.coding.mapper"})
@Configuration
public class RootConfig {

	// 2번 항목에서 설정한 Hikari DataSource
	@Bean
	public DataSource datasource() {
		HikariConfig hikariConfig = new HikariConfig();
		
        /* 기존 DB정보 주석처리 
        hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver");
		hikariConfig.setJdbcUrl("jdbc:mariadb://localhost:3306/test_database");
        */
        
        hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
		hikariConfig.setJdbcUrl("jdbc:log4jdbc:mariadb://localhost:3306/test_database");
		hikariConfig.setUsername("root");
		hikariConfig.setPassword("root");
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}
	
	// 3.2번 항목에서 설정한 SqlSessionFactory
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
		sqlSessionFactory.setDataSource(datasource());
        //3.3.4번 항목에서 설정한 setMapperLocation()
		sqlSessionFactory.setMapperLocations(
        		new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));
		return sqlSessionFactory.getObject();
	}
}

 

설정 파일 수정이 끝났으면 properties파일 하나를 추가해야 합니다.

현재 사용하고 있는 log4j.xml파일이 존재하는 경로에 log4jdbc.log4j2.properties를 아래와 같이 추가해줍니다.

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.drivers=org.mariadb.jdbc.Driver

 

이제 설정은 모두 끝났으니 테스트를 위해 3번 항목에서 사용했던 MapperTest를 다시 실행하면, 다음과 같이 쿼리의 질의 결과가 로그에 기록되는 것을 볼 수 있습니다.

log4jdbc-log4j2 Mapper Test Log


728x90

댓글