티스토리 뷰



오늘은 스프링 부트에서 간단한 설정으로, 콘솔에 쿼리를 출력하는 방법을 알아보려고 합니다.

개발 시에 상당히 도움이 되는 것 같습니다^^.

기존에 스프링 프로젝트에서는 log4jdbc-remix 라는 라이브러리를 통해, 출력을 할 수 있었구요.

당연히 적용하면 되겠지만, 스프링 부트에서는 https://code.google.com/p/log4jdbc-log4j2/


이곳에서 확인할 수 있는 log4jdbc-log4j2 를 이용합니다.


스프링 부트 프로젝트에서 pom.xml 에 라이브러리를 먼저 추가합니다.

1
2
3
4
5
<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>
cs


자바 7버전 이상에서 사용 가능한 최신 버전을 사용할게요.

그 다음 스프링부트의 기본 config 설정 파일인 application.properties 또는 application.yml 에서 설정을 해야합니다. ( 저는 yml을 사용했습니다.)


기존의 datasource 설정 방법은 아래와 같습니다. 저는 SQL Server를 이용중에 있어요!

1
2
3
4
5
spring:
  datasource:
    platform: mssql
    url: jdbc:sqlserver://localhost:1433;DatabaseName=TEST
    driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
cs


그러나, 쿼리를 출력하기 위해서는 아래와 같이 변경이 필요합니다. 

1
2
3
4
5
spring:
  datasource:
    platform: mssql
    url: jdbc:log4jdbc:sqlserver://localhost:1433;DatabaseName=TEST
    driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
cs

url 부분과 driverClassName 부분을 확인해주세요.


그러면, 이제 드라이버 클래스 설정 방법은 마무리가 되었고, 로그 출력에 대해서 설정파일을 변경을 해야 하는데요.


이 라이브러리를 사용할 때에는 Spring boot의 기본 로그 설정 파일인 logback.xml 파일과 함께 log4jdbc.log4j2.properties 라는 파일을 같이 생성해야 합니다. ( 이름 정확하게 입력해 주세요. )


logback.xml은 프로젝트의 패키지에 따른 출력, root 출력 등과 같은 부분도 설정할 수 잇구요.

jdbc sql 관련해서 설정도 할 수 잇습니다.

쿼리 출력 부분에 대해서만 본다면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<!--  
jdbc.sqlonly    : Logs only SQL
jdbc.sqltiming  : Logs the SQL, post-execution, including timing execution statistics
jdbc.audit      : Logs ALL JDBC calls except for ResultSets
jdbc.resultset  : all calls to ResultSet objects are logged
jdbc.connection : Logs connection open and close events
-->
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
    </encoder>
  </appender>
  
  <logger name="jdbc" level="OFF"/>
  
  <logger name="jdbc.sqlonly" level="DEBUG" additivity="false">>
    <appender-ref ref="STDOUT" />
  </logger>  
  
  <logger name="jdbc.resultsettable" level="DEBUG" additivity="false">
    <appender-ref ref="STDOUT" />
  </logger>  
  
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
  
</configuration>
cs


주석으로 설명도 되어 있긴 하지만 앞에 명칭 부분만 봐도 알 수 있듯이, 저는 쿼리 부분만, 그리고 결과만 출력하도록 설정을 하였습니다.


시간을 같이 보고 싶으신 분은 sqltiming을 사용하시면 되겟고, 결과를 제외한 모든 jdbc call을 보고 싶으신 분은 audit을 사용하면 되겟습니다.


위에 코드 구글 페이지로 가서 확인해보면, 상세하게 알 수 있지만, 로그 출력 방식은 그냥 log4j 와 SLF4J 사용하는 방법이 있네요.


마지막으로, log4jdbc.log4j2.properties 파일 설정인데요. 이 부분에서 slf4j를 사용하도록 logdelegator의 이름을 설정하는 것입니다.


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


별다른 설정이 필요 없네요. 1번 라인만 설정 되어 있으면, 쿼리가 한줄로 표시 됩니다.

2번 라인처럼 maxlinelength를 0으로 설정하면, 멀티-라인으로 쿼리가 출력이 됩니다.


저는 이제 스프링 부트 프로젝트에 MYBATIS를 설정해서 사용하고 있는데요, 쿼리 출력이 잘 됩니다.


물론, Spring DATA JPA의 쿼리도 잘 출력이 된다고 하네요.


이건 꿀팁(?) 까진 아니고,,, 쿼리가 출력될때 첫번째 라인은 로그 출력 첫번째 라인이라 앞 공백이 제거되어서 혼자 앞으로 튀어나와 있거나 그런데요...(멀티라인일때...)


저같은 경우는 MYBATIS라서, 쿼리 작성할 때 맨 윗줄에 SQL 주석으로 쿼리의 내용을 설명하는 문구를 넣었어요.


그러면 첫번째 라인은 주석으로 처리가 되어서, 출력 때에도 설명을 볼 수 있고, 두번째라인부터는 줄바꿈이 되어 있어서, 공백처리없이 깔끔하게 쿼리를 확인할 수가 있네요!


감사합니다.


--

한동안 게을러서 책도 안보고, 공부도 안하고, 겜만하고 살았는데요 ㅠㅠ

자바에 대해서 좀 더 깊게 공부를 하기 위해 생각하던 중에 자바 8버전으로 새로 쓰인 자바 책이 나오더라구요~

자바8로 공부하면서, 깊이 있는 자바 공부를 좀 더 해보려고 합니다.


가끔 머리도 좋고.. 개발도 잘 하시는 분들이... 써놓은 블로그를 보면.. 시무룩... 평법한 초보개발자는 웁니다...ㅎㅎ






댓글