ÃֽŠ°Ô½Ã±Û(JAVA)
2020.10.21 / 10:34

Part1. °³¹ßȯ°æ ±¸Ãà - ½ºÇÁ¸µ°ú MySql + Mybatis ¿¬µ¿

Ãß¼®µ¹ÀÌ
Ãßõ ¼ö 292

ÀÌ¹Ì mysql ¼³Ä¡¿Í ±âº»ÀûÀÎ ¼³Á¤Àº ¿Ï·áµÇ¾ú°í ½ºÇÁ¸µ°ú ¿¬µ¿¸¸ ½ÃÅ°¸é µÈ´Ù. ƯÈ÷ Ä¿³Ø¼Ç Ç®À» ÀÌ¿ëÇؼ­ ¿©·¯¸íÀÇ »ç¿ëÀÚ¸¦ µ¿½Ã¿¡ ó¸®ÇØ¾ß Çϱ⠶§¹®¿¡ ¾Æ¿¹ ½ºÇÁ¸µ¿¡ Ä¿³Ø¼Ç Ç®À» µî·ÏÇؼ­ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. java¿¡¼­´Â DataSource ¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ­ Ä¿³Ø¼Ç Ç®À» »ç¿ëÇÑ´Ù. ÀÌ°É ÀÌ¿ëÇÏ¸é ¸Å¹ø µ¥ÀÌÅͺ£À̽º¿Í ¿¬°áÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¹Ì¸® ¿¬°áÀ» ¸Î¾îÁÖ°í º¯È¯ÇÏ´Â ±¸Á¶¸¦ ÀÌ¿ëÇϱ⠶§¹®¿¡ ¼º´ÉÇâ»ó¿¡ µµ¿òÀÌ µÈ´Ù.

Ȥ½Ã mysql ¼³Ä¡¹æ¹ýÀÌ ¸ð¸¥´Ù¸é ´ÙÀ½ ¸µÅ©ÂüÁ¶

https://all-record.tistory.com/93

Ä¿³Ø¼Ç Ç®Àº ¿©·¯ Á¾·ù°¡ ÀÖ°í spring-jdbc ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ´Â ¹æ½Äµµ ÀÖÁö¸¸, ¿¹Á¦´Â ÃÖ±Ù À¯ÇàÇÏ´Â È÷Ä«¸®CP¸¦ ÀÌ¿ëÇÑ´Ù.

È÷Ä«¸® ¼º´É¿¡ ´ëÇؼ­´Â ´ÙÀ½ ¸µÅ© ÂüÁ¶

https://jeong-pro.tistory.com/162

Ã¥ °³Á¤ÆÇÀÌ Á¶±Ý ¾Æ½¬¿î Á¡ÀÌ ¿À¶óŬ µðºñ·Î¸¸ ¼³Á¤Çϱ⠶§¹®¿¡ ÄÚµù´Ü Ä«Æä¿¡¼­ ÀúÀÚ°¡ ¹èÆ÷ÇÑ mysql ¼³Á¤ ÆÄÀÏÀ» ºÁ¾ß¸¸ Á¦´ë·ÎµÈ ¿¬µ¿ÀÌ °¡´ÉÇÏ´Ù.

1. ¶óÀ̺귯¸® Ãß°¡¿Í DataSource ¼³Á¤

pom.xmlÀ» ¼öÁ¤Çؼ­ HikariCP¸¦ Ãß°¡ÇÑ´Ù.

<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.3.1</version> </dependency>

ÀÌÁ¦ root-context.xml ¿¡ Á÷Á¢ <bean> ű׸¦ Á¤ÀÇÇؼ­ ÀÛ¼ºÇϴµ¥ °³Á¤ÆÇ¿¡´Â ÇØ´ç ³»¿ëÀÌ ¾øÀ¸¹Ç·Î ´ÙÀ½ Äڵ带 Âü°íÇÏÀÚ.

mybatis±îÁö ¼³Á¤¿Ï·áµÈ ÄÚµåÀÌ´Ù

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/book_ex?useSSL=false&amp;serverTimezone=Asia/Seoul"></property> <property name="username" value="zerock"></property> <property name="password" value="zerock"></property> </bean> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig" /> </bean> <context:component-scan base-package="org.zerock.service"> </context:component-scan> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="typeAliasesPackage" value="org.zerock.domain"></property> </bean> <mybatis-spring:scan base-package="org.zerock.mapper"/> </beans>

ºóÀ» ÀÌ·¸°Ô Á¤ÀÇÇÑ ÈÄ¿¡´Â Ç×»ó Å×½ºÆ®¸¦ Çغ¸ÀÚ. 'src/text/java'¿¡ DataSourceTestsŬ·¡½º¸¦ ÀÛ¼ºÇÑ´Ù.

package org.zerock.persistence; import static org.junit.Assert.fail; import java.sql.Connection; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; 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 lombok.Setter; import lombok.extern.log4j.Log4j; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") //Java¼³Á¤À» ÀÌ¿ëÇÏ´Â °æ¿ì //@ContextConfiguration(classes= {RootConfig.class}) @Log4j public class DataSourceTests { @Setter(onMethod_ = {@Autowired}) private DataSource dataSource; @Setter(onMethod_ = {@Autowired}) private SqlSessionFactory sqlSessionFactory; @Test public void testmyBatis() { try(SqlSession session = sqlSessionFactory.openSession(); Connection con = session.getConnection(); ) { log.info(session); log.info(con); } catch(Exception e) { fail(e.getMessage()); } } }

ÀÌ Å×½ºÆ®´Â ½ºÇÁ¸µ¿¡ ºóÀ¸·Î µî·ÏµÈ DataSource¸¦ ÀÌ¿ëÇؼ­ ConnectionÀ» Á¦´ë·Î ó¸®ÇÒ ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇÏ´Â ¿ëµµÀÌ´Ù testConnection()À» ½Ç?³? ³»ºÎÀûÀ¸·Î È÷Ä«¸®CP°¡ ½ÃÀ۵ǰí, Á¾·áµÇ´Â ·Î±×¸¦ º¼ ¼ö ÀÖ´Ù.

INFO : com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... INFO : com.zaxxer.hikari.pool.PoolBase - HikariPool-1 - Driver does not support get/set network timeout for connections. (net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy.getNetworkTimeout()I) INFO : com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. INFO : org.zerock.persistence.DataSourceTests - org.apache.ibatis.session.defaults.DefaultSqlSession@5884a914 INFO : org.zerock.persistence.DataSourceTests - HikariProxyConnection@2032169857 wrapping net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@491b9b8 INFO : org.springframework.context.support.GenericApplicationContext - Closing org.springframework.context.support.GenericApplicationContext@6f1fba17: startup date [Wed Jul 24 21:26:02 KST 2019]; root of context hierarchy INFO : com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... INFO : com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.

Mybatis ¿¬µ¿

MyBatis´Â ÈçÈ÷ SQL¸ÅÇÎ ÇÁ·¹ÀÓ¿öÅ©·Î ºÐ·ùµÇ´Âµ¥, °³¹ßÀÚµéÀº JDBCÄÚµåÀÇ º¹ÀâÇÏ°í Áö·çÇÑ ÀÛ¾÷À» ÇÇÇÏ´Â ¿ëµµ·Î »ç¿ëÇÑ´Ù. ÀåÁ¡À¸·Î´Â ´ÙÀ½°ú °°´Ù.

- ÀÚµ¿À¸·Î Connection close() rksmd

- Mybatis³»ºÎÀûÀ¸·Î PerparedStatementó¸®

- #{prop}¿Í °°ÀÌ ¼Ó¼ºÀ» ÁöÁ¤ÇÏ¸é ³»ºÎÀûÀ¸·Î ÀÚµ¿Ã³¸®

- ¸®ÅÏŸÀÔÀ» ÁöÁ¤ÇÏ´Â °æ¿ì ÀÚµ¿À¸·Î °´Ã¼ »ý¼º ¹× ResultSetó¸®

Mybatis ´Â ±âÁ¸ÀÇ SQLÀ» ±×´ë·Î È°¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ°í ÁøÀÔÀ庮ÀÌ ³·Àº ÆíÀ̾ JDBCÀÇ ´ë¾ÈÀ¸·Î ¸¹ÀÌ »ç¿ëÇÑ´Ù. ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©ÀÇ Æ¯Â¡ Áß Çϳª´Â ´Ù¸¥ ÇÁ·¹ÀÓ¿öÅ©µéÀ» ¹èôÇÏ´Â ´ë½Å ´Ù¸¥ ÇÁ·¹ÀÓ¿öÅ©µé°úÀÇ ¿¬µ¿À» ½±°ÔÇÏ´Â Ãß°¡ÀûÀÎ ¶óÀ̺귯¸®µéÀÌ ¸¹´Ù´Â °ÍÀÌ´Ù. Mybatis¿ª½Ã mybatis-springÀ̶ó´Â ¶óÀ̺귯¸®¸¦ ÅëÇØ ¿¬µ¿ÀÛ¾÷À» ó¸®ÇÒ ¼ö ÀÖ´Ù.

1. Mybatis °ü·Ã ¶óÀ̺귯¸® Ãß°¡

Mybatis ¿Í mybatis-springÀ» »ç¿ëÇϱâ À§Çؼ­ pom.xml ÆÄÀÏ¿¡ Ãß°¡ÀûÀÎ ¶óÀ̺귯¸®µéÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù.

´ÙÀ½Àº pom.xml¿¡ Ãß°¡µÇ´Â ¶óÀ̺귯¸® ÄÚµåÀÌ´Ù.

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency>

2. SQLSessionFactory

MyBatis¿¡¼­ °¡Àå ÇÙ½ÉÀûÀÎ °´Ã¼´Â SQLSessionÀ̶ó´Â Á¸Àç¿Í SQLSessionFactoryÀÌ´Ù. À̸§¿¡¼­ º¸µí ³»ºÎÀûÀ¸·Î SQLSessionÀ̶ó´Â °ÍÀ» ¸¸µé¾î ³»´Â Á¸ÀçÀε¥, °³¹ß¿¡¼­´Â SQLSession À» ÅëÇؼ­ ConnectionÀ» »ý¼ºÇϰųª ¿øÇÏ´Â SQLÀ» Àü´ÞÇÏ°í, °á°ú¸¦ ¸®ÅϹ޴ ±¸Á¶·Î ÀÛ¼ºÇÏ°Ô µÈ´Ù.

root-context.xml ¿¡ sqlSessionFactory ºóÀ» Ãß°¡ÇØ¾ß Çϴµ¥ À§¿¡ ÀÌ¹Ì ÇØ´ç Äڵ尡 Æ÷ÇÔµÈ root-context.xml ¼Ò½º¸¦ ¿Ã·Á³ù´Ù.

3. ½ºÇÁ¸µ°úÀÇ ¿¬µ¿

3.1 Mapper ÀÎÅÍÆäÀ̽º

Mapper¸¦ ÀÛ¼ºÇÏ´Â ÀÛ¾÷Àº xmlÀ» ÀÌ¿ëÇÒ ¼öµµ ÀÖÁö¸¸, À̹ø ¿¹Á¦´Â ÃÖ¼ÒÇÑÀÇ Äڵ带 ÀÛ¼ºÇÏ´Â MapperÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇغ¸°Ú´Ù.

TimeMapper ¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ Ãß°¡ÇÑ´Ù. Mapper ¿¡ ´ëÇÑ ¼³¸íÀº µû·Î Æ÷½ºÆÃÇؾ߰ڴÙ.

TimeMapper ÀÎÅÍÆäÀ̽º´Â MyBatisÀÇ ¾î³ëÅ×À̼ÇÀ» ÀÌ¿ëÇÏ¿© SQLÀ» ¸Þ¼­µå¿¡ Ãß°¡ÇÑ´Ù.

package org.zerock.mapper; import org.apache.ibatis.annotations.Select; public interface TimeMapper { @Select("SELECT sysdate() From dual") public String getTime(); public String getTime2(); }

ÀÛ¼ºÇß´Ù¸é Mybatis°¡ µ¿ÀÛÇÒ ¶§ Mapper¸¦ ÀνÄÇÒ ¼ö ÀÖµµ·Ï, root-context,xml ¿¡ Ãß°¡¼³Á¤ÀÌ ÇÊ¿äÇÏ´Ù. °£´ÜÇÑ ¹æ½ÄÀº <mybatis:scan>À̶ó´Â ű׸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù.

´ÙÀ½Àº root-context.xmlÀÇ ÀϺÎÀÌ´Ù.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="typeAliasesPackage" value="org.zerock.domain"></property> </bean> <mybatis-spring:scan base-package="org.zerock.mapper"/>

base-package ¼Ó¼ºÀº ÁöÁ¤µÈ ÆÐÅ°ÁöÀÇ ¸ðµç MyBatis°ü·Ã ¾î³ëÅ×À̼ÇÀ» ã¾Æ¼­ ó¸®ÇÑ´Ù. Mapper¸¦ ¼³Á¤ÇÏ´Â ÀÛ¾÷Àº °¢°¢ÀÇ xml À̳ª mapper ÀÎÅÍÆäÀ̽º¸¦ ¼³Á¤ÇÒ ¼öµµ ÀÖÁö¸¸, ³Ê¹« ¹øÀâÇϱ⠶§¹®¿¡ ÀÚµ¿À¸·Î ÆÐÅ°Áö¸¦ ÀνÄÇÏ´Â ¹æ½ÄÀ¸·Î ó¸®ÇÏ´Â ¹æ¹ýÀÌ °¡Àå Æí¸®ÇÏ´Ù.

3.2 Mapper Å×½ºÆ®

Mybatis-spring Àº Mapper ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇؼ­ ½ÇÁ¦ sql 󸮰¡ µÇ´Â Ŭ·¡½º¸¦ ÀÚµ¿À¸·Î »ý¼ºÇÑ´Ù. µû¶ó¼­ ÀÎÅÍÆäÀ̽º¿Í sql ¸¸À¸·Î ÀÛ¼ºÇÏ´Â ¹æ½ÄÀ¸·Îµµ ¸ðµç jdbc󸮸¦ ³¡³¾ ¼ö ÀÖ´Ù.

´ÙÀ½Àº TimeMapperTests Ŭ·¡½º´Ù.

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") // Java ¼³Á¤ÀÇ °æ¿ì ContextConfiguration(classes = {org.zerock.config.RootConfig.class}) @Log4j public class TimeMapperTests { @Setter(onMethod_ = @Autowired) private TimeMapper timeMapper; @Test public void testGetTime() { log.info(timeMapper.getClass().getName()); log.info(timeMapper.getTime()); }

¿ì¼± ½ºÇÁ¸µÀÌ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇؼ­ °´Ã¼¸¦ »ý¼ºÇÑ´Ù´Â »ç½Ç¿¡ ÁÖ¸ñÇÏÀÚ.

3.3 XML ¸ÅÆÛ¿Í °°ÀÌ ¾²±â

MyBatis¸¦ ÀÌ¿ëÇؼ­ SQLÀ» ó¸®ÇÒ ¶§ ¾î³ëÅ×À̼ÇÀ» ÀÌ¿ëÇÏ´Â ¹æ½ÄÀÌ ¾ÐµµÀûÀ¸·Î Æí¸®Çϱâ´Â ÇÏÁö¸¸, SQLÀÌ º¹ÀâÇϰųª ±æ¾îÁö´Â °æ¿ì¿¡´Â ¾î³ëÅ×ÀÌ¼Ç º¸´Ù´Â xmlÀ» ÀÌ¿ëÇÏ´Â ¹æ½ÄÀ» ´õ ¼±È£ÇÏ°Ô µÈ´Ù. ´ÙÇàÈ÷ MyBatis-Spring ÀÇ °æ¿ì Mapper ÀÎÅÍÆäÀ̽º¿Í xmlÀ» µ¿½Ã¿¡ »ç¿ë°¡´ÉÇÏ´Ù.

xmlÀ» ÀÛ¼ºÇÒ ¶§ xml ÆÄÀÏÀÇ À§Ä¡¿Í xml ÆÄÀÏ¿¡ ÁöÁ¤µÇ¾î ÀÖ´Â namespace ¼Ó¼ºÀÌ Áß¿äÇѵ¥, xml ÆÄÀÏ À§Ä¡ÀÇ °æ¿ì mapper ÀÎÅÍÆäÀ̽º°¡ ÀÖ´Â °÷¿¡ °°ÀÌ ÀÛ¼ºÇϰųª src/main/resources ±¸Á¶¿¡ xml À» ÀúÀåÇÒ Æú´õ¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. xml ÆÄÀÏÀ» ¸¸µé ¶§ À̸§¿¡ ´ëÇÑ ±ÔÄ¢Àº ¾øÁö¸¸, °¡´ÉÇÏ´Ù¸é mapper ÀÎÅÍÆäÀ̽º¿Í °°Àº À̸§À» ÀÌ¿ëÇÏ´Â °ÍÀÌ °¡µ¶¼ºÀ» ³ôÈù´Ù.

src/main/resources Æú´õ ³» ´ÙÀ½Ã³·³ mapper Æú´õ¸¦ ÀÛ¼ºÇÑ´Ù.

Çѹø¿¡ ÇÑ Æú´õ¾¿ »ý¼º

xml ÆÄÀÏ¿¡´Â MybatisÀÇ XML ¸ÅÆÛ¿¡¼­ »ç¿ëÇϴ ű׿¡ ´ëÇÑ ¼³Á¤ÀÌ ÇÊ¿äÇÏ´Ù.

Mapper ÀÎÅÍÆäÀ̽º¿Í xmlÀ» °°ÀÌ ÀÌ¿ëÇØ º¸±â À§Çؼ­ ±âÁ¸ÀÇ TimeMapper ÀÎÅÍÆäÀ̽º¿¡ Ãß°¡ÀûÀÎ ¸Þ¼­µå¸¦ ¼±¾ðÇÑ´Ù.

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") // Java ¼³Á¤ÀÇ °æ¿ì ContextConfiguration(classes = {org.zerock.config.RootConfig.class}) @Log4j public class TimeMapperTests { @Setter(onMethod_ = @Autowired) private TimeMapper timeMapper; @Test public void testGetTime2() { log.info("getTime2"); log.info(timeMapper.getTime2()); }

getTime2()°¡ Ãß°¡µÆ´Âµ¥, ƯÀÌÇÏ°Ôµµ @Select ¿Í °°ÀÌ MybatisÀÇ ¾î³ëÅ×À̼ÇÀÌ Á¸ÀçÇÏÁö ¾Ê°í sql ¿ª½Ã Á¸ÀçÇÏÁö ¾Ê´Â´Ù.

½ÇÁ¦ sql Àº xmlÀ» ÀÌ¿ëÇؼ­ ó¸®ÇÒ °ÍÀ̹ǷÎ, »ý¼ºÇÑ 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>

<select> ű×ÀÇ id ¼Ó¼º°ªÀº ¸Þ¼­µåÀÇ À̸§°ú µ¿ÀÏÇÏ°Ô ¸ÂÃç¾ß ÇÑ´Ù. <select> ű×ÀÇ °æ¿ì resultType ¼Ó¼ºÀ» °¡Áö´Âµ¥ ÀÌ °ªÀº ÀÎÅÍÆäÀ̽º¿¡ ¼±¾ðµÈ ¸Þ¼­µåÀÇ ¸®ÅÏ Å¸ÀÔ°ú µ¿ÀÏÇÏ°Ô ÀÛ¼ºÇÑ´Ù.

4. log4jdbc-log4j2 ¼³Á¤

Mybatis´Â ³»ºÎÀûÀ¸·Î JDBCÀÇ PreparedStatement ¸¦ ÀÌ¿ëÇؼ­ SQLÀ» ó¸®ÇÑ´Ù. µû¶ó¼­ ÆĶó¹ÌÅÍ´Â jdbc¿¡¼­ ó·³ ? À¸·Î ġȯµÇ¾î¼­ 󸮵ȴÙ. º¹ÀâÇÑ SQL ÀÇ °æ¿ì ? ÀÇ °ªÀÌ Á¦´ë·Î ³ª¿Ô´ÂÁö È®ÀÎÀÌ ¾î·Æ°í ½ÇÇàµÈ SQLÀÇ ³»¿ëÀ» Á¤È®È÷ È®ÀÎÇϱ⠾î·Æ´Ù. ÀÌ·±¹®Á¦¸¦ È®ÀÎÇÏ·Á°í log4jdbc-log4j2¶óÀ̺귯¸®°¡ ÇÊ¿äÇÑ °ÍÀÌ´Ù.

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

pom.xml¿¡ À§¿Í°°ÀÌ ¶óÀ̺귯¸®¸¦ Ãß°¡ÇÑ´Ù. Ãß°¡ÇÑ ÈÄ¿¡´Â (1) ·Î±× ¼³Á¤ÆÄÀÏÀ» Ãß°¡ÇÏ´Â ÀÛ¾÷ (2) JDBC¿¬°á Á¤º¸¸¦ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. src/main/resources ¹Ø¿¡ log4jdbc.log4j2.properties ÆÄÀÏÀ» Ãß°¡ÇÑ´Ù.

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

log4jdbc¸¦ ÀÌ¿ëÇÏ´Â °æ¿ì JDBC µå¶óÀ̹ö¿Í URL Á¤º¸¸¦ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. root-context.xmlÀÇ ÀϺθ¦ ¼öÁ¤ÇÏÀÚ. ´Ù½Ã¸»ÇÏÁö¸¸ root-context.xmlÀº beanÀ» ¼³Á¤ÇÏ´Â °÷ÀÌ´Ù.

<bean id ="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <!-- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/book_ex?useSSL=false&amp;serverTimezone=Asia/Seoul"></property> --> <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property> <property name="jdbcUrl" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/book_ex?useSSL=false&amp;serverTimezone=Asia/Seoul"></property> <property name="username" value="root"></property> <property name="password" value="thdgkals12!"></property> </bean>

ÀÌ·¸°Ô ¼öÁ¤ÇÏ¸é µÇ´Âµ¥ dataSource() ¸Þ¼­µå¿¡¼­ º¯°æµÇ´Â ºÎºÐÀº JDBCµå¶óÀ̹öÀÇ Å¬·¡½º¸¦ 'net.sf.log4jdbc.sql.jdbcapo.DriverSpy·Î º¯°æÇÏ´Â ÀÛ¾÷°ú JDBC ¿¬°á URL ºÎºÐ¿¡¼­ Áß°£¿¡ log4jdbc ¹®ÀÚ¿­ÀÌ Ãß°¡µÇ´Â ºÎºÐÀÌ´Ù. ÀÌ µÎ ¼³Á¤ÀÌ µÇ¾îÀÖÁö ¾ÊÀ¸¸é ·Î±×°¡ Á¤»óÀûÀ¸·Î ±â·ÏµÇÁö ¾Ê´Â´Ù.