상세 컨텐츠

본문 제목

MyBatis query log (변수 매핑된 쿼리 로그 출력)

Spring

by husks 2020. 2. 20. 09:57

본문

반응형

 

Spring을 사용해서 개발을 하다보면 페이지에서 실행한 쿼리를 확인하고 싶습니다.

 

기본적으로 쿼리가 보여지게 되지만 보기에 불편하게 한줄로 나오거나 변수의 매핑이 안된채 출력 됩니다.

 

아래와 같이 ?(물음표)로 표현됩니다.

SELECT USER_NM, EMAIL FROM USER WHERE USER_ID = ?

 

물론 Parameters 의 값도 로그에 출력되기 때문에 직접 매핑해야 하지만 갯수가 늘어나면 엄청 귀찮습니다.

 

그리고 정렬도 XML에 선언한 쿼리문이 출력되지 않고 한줄로 나오기 때문에 보기에도 불편합니다.

 

위 두가지 불편함을 해결하는 방법을 확인해 보겠습니다.

반응형

1. 일단 pom.xml 을 열어서 아래내용을 추가해 줍니다. (로그 출력하는 dependency 추가)

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

 

2. jdbc-config.xml 도 열어줍니다.

<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
 

위 내용을 아래와 같이 변경해 줍니다.

(기존 dataSource를 Log4jdbcProxyDataSource로 한번 감싼다고 생각하시는게 이해하기 좋습니다.)

<bean id="dataSourceSpied" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</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>
 
마지막으로 log4j.xml 을 열어서 아래 내용을 추가해 줍니다. (어떠한 항목을 출력할껀지 설정)
<!-- SQL Logger -->
<!--  SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds) -->
<logger name="jdbc.sqltiming" additivity="false">
    <level value="warn" />
    <appender-ref ref="console"/> 
</logger>
<!--  SQL 쿼리 문장 -->
<logger name="jdbc.sqlonly" additivity="false"> 
    <level value="info"/> 
    <appender-ref ref="console"/> 
</logger>
 
<!--  ResultSet을 제외한 모든 JDBC 호출 정보 -->
<logger name="jdbc.audit" additivity="false"> 
    <level value="warn"/>  
    <appender-ref ref="console"/> 
</logger> 
 
<!--  ResultSet을 포함한 모든 JDBC 호출 정보 -->
<logger name="jdbc.resultset" additivity="false">
    <level value="warn" />
    <appender-ref ref="console"/> 
</logger>
 
<!-- SQL 결과 조회된 데이터의 table을 로그 -->
<logger name="jdbc.resultsettable" additivity="false"> 
    <level value="warn"/>  
    <appender-ref ref="console"/> 
</logger>

 

위 내용을 간단히 설명하자면

 


1. 로그 출력하도록 jar 선언


2. 쿼리 실행하는 부분을 새로 선언한 jar 에서 형식에 맞게 로그 출력


3. 쿼리 출력시 보고싶은 정보의 레벨을 설정

 

정상적으로 셋팅이 되었다면 아래와 같이 출력 됩니다.

SELECT USER_NM, EMAIL FROM USER WHERE USER_ID = 3
반응형

관련글 더보기

댓글 영역