SPRING
2020.10.21 / 10:50

마이바티스(MyBatis) 쿼리 로그 출력 및 정렬하기

추석돌이
추천 수 15
마이바티스(MyBatis) 쿼리 로그 출력 및 정렬하기

마이바티스를 이용하여 개발을 하다보면 쿼리가 보이지 않거나, 파라미터가 안나오거나 개행문자(\n) 등이 무시되면서 한줄로 쭈~~~~욱 나와서 불편한 경우가 많습니다.


이러한 경우에는 개발하면서 불편한게 한두가지가 아닌데, 쿼리를 이쁘게 정렬해서 보기좋게 하는 방법을 보겠습니다.


1. 메이븐에 라이브러리 추가

pom.xml을 열어서 다음과 같은 라이브러리를 추가합니다. 

<dependency>
	<groupId>org.lazyluke</groupId>
	<artifactId>log4jdbc-remix</artifactId>
	<version>0.2.7</version>
</dependency>


2. log4j 설정 변경

log4j.xml을 열어서 다음과 같이 수정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />
        </layout>   
    </appender>
    
    <appender name="console-infolog" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p %m%n" />
        </layout>   
    </appender>
	
	<!-- Application Loggers -->
	<logger name="first" additivity="false">
		<level value="debug" />
		<appender-ref ref="console"/>
	</logger>
	
	<!-- Query Loggers -->
	<logger name="jdbc.sqlonly" additivity="false">  
    	<level value="INFO"/>  
        <appender-ref ref="console-infolog"/>  
    </logger>
    
    <logger name="jdbc.resultsettable" additivity="false">  
    	<level value="INFO"/>  
        <appender-ref ref="console"/>  
    </logger>  

	<!-- Root Logger -->
	<root>
		<priority value="off"/>
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>
3. jdbc 설정을 다음과 같이 바꿉니다.

저는 context-datasource.xml에 DB 연결설정이 되어있습니다. (http://addio3305.tistory.com/62 참조) 

만약 저랑 다르신분들은................ DB 연결설정이 되어있는 파일을 수정하시면 됩니다.


context-datasource.xml을 열고 다음과 같이 수정합니다. 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
						http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
    
    <bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
        <property name="username" value="아이디"/>
        <property name="password" value="비밀번호"/>
    </bean>
    
    <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
		<constructor-arg ref="dataSourceSpied" />
		<property name="logFormatter">
			<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
				<property name="loggingType" value="MULTI_LINE" />
				<property name="sqlPrefix" value="SQL         :  "/>
			</bean>
		</property>
	</bean>
</beans>

기존에는 jdbc를 이용한 DB 연결을 dataSource라는 이름으로 바로 사용했었습니다. log4j-remix는 이러한 쿼리를 중간에 가로채서 

이쁘게 정렬시켜주는 역할을 합니다.


위에서 보신것처럼 기존에 DB와 연결하는것은 dataSourceSpied로 변경하고, 새로 dataSource를 만들었습니다.

그리고 로그타입과 쿼리를 어떻게 출력할지를 설정해주었습니다. 


4. 확인을 해봅시다.

이제 설정은 모두 완료가 되었으니 정확히 동작하는지 보겠습니다. 


먼저, 기존에 log4j 와 log4j-remix가 설정되지 않았을 경우입니다.


네.... 참으로 횡~~~~한 로그창이네요 -_-;



다음은 모두 설정한 후의 결과입니다.

네!!! 많이 달라졌습니다.


사진에서 볼수있는것처럼 

1. 쿼리가 정렬되어 이쁘게 출력된다.

2. 결과가 이쁘게 표로 나온다. 

를 알수 있습니다.


log4j,xml 에서 jdbc.sqlonly 로거를 이용하여 쿼리를 출력하도록 하였고, context-datasource.xml에서 추가한 dataSourceSpied (log4j-remix)가 쿼리를 정렬해주었습니다.


그리고 jdbc.resultsettable이라는 logger를 추가하여 결과쿼리도 나오게 하였습니다. 이 logger를 없애면 결과테이블도 안나오겠죠 ㅇㅇ;


이렇게 쿼리를 정렬하여 로그를 남김으로써 개발에 도움이 됩니다.


마지막으로, 이러한 로거는 당연히 성능에 영향을 미칩니다. 

그러므로 개발시에만 이렇게 로그를 남기고, 실제 운영에서는 이러한 설정을 없애는게 좋습니다.



출처: https://addio3305.tistory.com/66 [흔한 개발자의 개발 노트]