스프링 부트(Spring boot) 마이바티스(Mybatis) 에서 쿼리 로그 출력 및 정렬하기.

|

(이 내용은 Spring boot의 logback(기본로그설정)을 사용하며 mybatis를 사용한다고 가정한다.)

Spring boot 와 Mybatis를 이용하여 초기 셋팅 후 개발을 하다 보면 쿼리가 나오지 않거나 혹은 쿼리가 나오게 mapper 에 해당하는 패키지의 log를 debug 레벨로 두더라도 쿼리가 한줄로 나오거나 파라미터가 ? 로 따로 찍히는 현상이 발생한다. Spring data jpa 를 사용하면 아래 간단한 옵션으로 정렬된 SQL 구문을 볼 수 있으나 Mybatis 사용시엔 그렇지 않다.

spring boot data jpa 사용 시 쿼리 정렬 옵션

spring.jpa.properties.hibernate.format_sql=true

정렬 처리가 되어있지 않을 경우 개발하면서 불편한게 한두가지가 아니다. 아래 내용을 적용하면 쿼리를 보기좋게 하여 좀 더 생산성을 높일 수 있다.

1. pom.xml 에 다음 라이브러리 추가.


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

2. application.yml에서 기존 사용하던 driver 및 url 정보 변경. (주석 참고)

spring:
  datasource:
    #url: jdbc:mysql://localhost:3306/sample  ## 1. 기존 사용하던 jdbc:mysql 로 시작하는 url 주석처리 후 jdbc:log4jdbc:mysql 로 시작하는 url 로 변경.
    url: jdbc:log4jdbc:mysql://localhost:3306/sample
    username: jmlim
    password: 123456
    #driver-class-name: com.mysql.jdbc.Driver ## 2. 기존 사용하던 com.mysql.jdbc.Driver를 net.sf.log4jdbc.sql.jdbcapi.DriverSpy 로 변경.
    driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
    hikari:
      connection-timeout: 5000
      validation-timeout: 1000
      maximum-pool-size: 30
      minimum-idle: 2
      connection-test-query: SELECT 1

3. application.yml 에서 jdbc.sqlonly 패키지에 대한 로깅 레벨 추가. (주석 참고)


logging:
  level:
    jdbc.sqlonly: DEBUG ## 이부분 추가.
    org.springframework.web: DEBUG
    com.zaxxer.hikari.HikariDataSource: ERROR

참고로 log4jdbc는 아래와 같은 옵션들을 제공한다.

 1. jdbc.sqlonly : SQL문 만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다.
 2. jdbc.sqltiming : SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. 
 3. jdbc.audit : ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. 
 4. jdbc.resultset : ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. 
 5. jdbc.resultsettable : SQL 결과 조회된 데이터의 table을 로그로 남긴다.

각옵션들의 기능을 정확히 알기 위해서는 직접 하나씩 변경해 보며 구동하는 것이 좋을 것이다.

4. resources 경로 밑에 log4jdbc.log4j2.properties 파일 추가.


log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

5. 출력결과


2018-12-26 18:31:57.381 [pool-2-thread-1] DEBUG jdbc.sqlonly [223] - com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
1. /* [TEST] io.jmlim.sample.mapper.SampleMapper#selectSampleList */
  SELECT CODE
       , NAME
       , START_DATE
       , END_DATE
       , GRADE_TYPE
       , GRADE_VALUE
    FROM JM_SAMPLE
   WHERE USE_FLAG = 'Y'
     AND CODE = 'JM00001'

참고자료

  • https://www.leafcats.com/45
  • https://modunote.tistory.com/143

Comments