ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 마이바티스(MyBatis) 쿼리 로그 출력 및 정렬하기
    기타 2015.04.10 11:04

    마이바티스를 이용하여 개발을 하다보면 쿼리가 보이지 않거나, 파라미터가 안나오거나 개행문자(\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를 없애면 결과테이블도 안나오겠죠 ㅇㅇ;


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


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

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







    댓글 33

    • 이전 댓글 더보기
    • 김상찬 2015.07.01 17:52

      안녕하세요 덕분에 따라하기로 잘 배우고 있습니다.
      부끄럽지만 질문 하나만 드릴께요
      위와 같이 설정은 다 되었는데 현재 debug는 출력이 잘 됩니다.
      근데 왜 sql만 출력이 안되는지 알수가 없네요.
      appender 부분은 동일하고, Query Loggers 부분도 동일합니다.
      dataSource 부분도 오라클이 아니라 MySql을 쓰는것 빼고 동일합니다.

      • Favicon of https://addio3305.tistory.com BlogIcon 카루시에라 2015.07.01 20:32 신고

        제가 여기서는 Oracle로 설명을 하였지만, 현재 진행하고 있는 프로젝트는 MySql을 사용하는데, 동일한 설정으로 똑같은 결과가 나오고 있습니다.
        먼저 http://addio3305.tistory.com/72 이 글의 첨부파일을 한번 다운받으셔서 비교를 해보시는게 어떨까요?

    • 김상찬 2015.07.02 14:24

      틀린곳을 하나 찾긴 했는데 이것때문에 그런것같지는 않네요
      action-servlet.xml 부분에 UrlBasedViewResolver를 쓴것을
      저는
      <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"></bean>
      <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
      <property name="definitions" value="/WEB-INF/config/tiles/*-tiles.xml"></property>
      </bean>
      이렇게 tiles를 쓴것말고는 같더군요.. ㅠㅠ

    • 김상찬 2015.07.03 16:39

      원인은 찾은듯 합니다.
      음...제가 처음 프로젝트 생성시 경로를 잘못 기입했는지 모르겠으나
      servlet-datasource.xml 파일이 두개가 생성되어있더군요..
      src/main/webapp/WEB-INF/config/spring 에 있는것과
      src/main/resources/spring 에 똑같은 파일이 존재하더군요
      저는 config에 있는 servlet-datasource.xml 파일만 수정하고 했을때는 안돼서 이리저리 보다가 resources 밑에 servlet-datasource.xml 파일이 있길래 여긴 적용이 안되어있더군요. 수정하고 하니 잘 됩니다.
      근데 파일이 왜 두개가 생성되어있는지는 의문이네요 ㅜㅜ
      아무튼 답변 너무 감사드립니다.

      • Favicon of https://addio3305.tistory.com BlogIcon 카루시에라 2015.07.06 11:02 신고

        음...왜 두개가 생성이 되어있을까요?
        src/main/webapp/WEB-INF/config/spring은 root context쪽 설정이고, datasource는 servlet context라서 src/main/resources 쪽에 위치시켜놨었습니다~

    • LeeRyu 2015.07.18 14:15

      감사합니당^^

    • Favicon of https://seungdols.tistory.com BlogIcon seungdols 2015.07.20 16:29 신고

      덕분에 쉽게 스프링을 배우고 있는데요. 혹시 log4j 기반이 아니라 logback인 경우에는 어떻게 설정을 해주어야 할까요 ?

    • 보고싶다유건아 2015.09.16 03:36

      안녕하세요. 원래는 UI개발자 이지만 java개념도 알고있는 사람입니다.
      로그가 남지않아 지금까지 테스트해보고 이것저것 만져보니깐.. 아직 100프로 원인은 확인은 안되었으나 어느정도 분석이되어서 글을 쓰게됩니다.
      혹시나 안되시는분은 카루시에라님이 쓴 pom을 카피앤페스트해보세요. 됩니다.
      제 서버는 mariadb인데 되는거 확인했네요.
      혹시 어디쪽이 더문제인지 밝혀지면 다시 글을 쓰도록하겠습니다.
      덕분에 스프링 쉽게 배워갑니다.(서블릿으로 작업하다 다시 뒤집고 하고있는데.. 확실히 세팅시간 빼면 속도가 많이빠른 편인거같네요~)

      아!!! 저는 전자정부프레임웍 환경이였습니다.(혹시나 싶어서...)

    • 보고싶다유건아 2015.09.16 04:52

      도움이 되시길바라며 글을 긁적여 봅니다.
      전자정부프레임웍이며, 로그가 나오지않아 pom.xml을 처음부터 끝까지 다뜯어서 확인해본 결과입니다.
      egovframework.rte.psl.dataaccess 이게 들어가 있을시 로그를 불러오지 못하는 경우가 생기더라구요.
      이걸 주석처리를 한 상태에서는 현재 로그가 잘 나옵니다.
      저는 java개발자는 아니니 정확한건 저두 잘 모르겠네요.
      예전부터 로그나오는게 개념이 안잡혀서 지금까지 계속 삽질하는중인데.. egovframework.rte.psl.dataaccess이녀석때문에 안나오니.. 더 개념을 못잡겠네요... 에효;;

      • Favicon of https://addio3305.tistory.com BlogIcon 카루시에라 2015.09.16 10:42 신고

        음... 저도 전자정부 프레임워크를 이용하여 프로젝트를 구성해 봤었지만 그런 에러는 아직 경험을 해보지 못했는데, 전자정부 프레임워크의 버그인 듯 하네요.
        개인적으로는 전자정부 프레임워크를 좋아하지 않습니다. 뭔가 이것저것 기능은 많이 만들어져있고 편하게 사용할 수 있는 기능들도 꽤 있지만, 전체적인 구조를 봤을때는 저한테는 안맞더라구요.

    • delia 2015.09.18 14:10

      SQL 로그에 남기는 방법이 궁금했었는데,
      덕분에 간단하게 설정할 수 있었어요 감사합니다 ^^
      올려주시는 스프링 강좌 글 정말 잘 보고 있어요.
      개인적으로 스프링 프로젝트를 공부하면서도
      제대로 구성하고 있는 가에 대한 의구심이 많았는데
      덕분에 많은 참고를 하고 갑니다~

      • Favicon of https://addio3305.tistory.com BlogIcon 카루시에라 2015.09.19 01:01 신고

        제가 잡은 스프링 설정들도 100% 맞는거라고는 이야기 하기 힘들죠. 다만 이런 방식으로 할 수도 있구나 라고 생각해주시면 될것같습니다~ ^^

    • 길동무 2015.11.05 09:52

      정말 좋은 설명 잘 보고 갑니다. 다음회 노트에 대한 삽화가 궁금(?) 해지네요. ㅋㅋㅋ
      물론 내용은 당연한 거고요.

    • jinwoo 2016.02.04 19:09

      <logger name="first" additivity="false">
      <level value="debug" />
      <appender-ref ref="console"/>
      </logger>

      이 부분에서 name이 first인 이유가 궁금합니다!..

    • jinwoo 2016.02.04 19:13

      저는 왜...
      2016-02-04 19:12:49,813 DEBUG [java.sql.PreparedStatement] ==> Executing: SELECT * FROM LANGUAGE WHERE language_cd = ?
      2016-02-04 19:12:49,813 DEBUG [java.sql.PreparedStatement] ==> Parameters: 01(String)
      2016-02-04 19:12:49,915 DEBUG [java.sql.ResultSet] <== Columns: LANGUAGE_CD, LANGUAGE_NM
      2016-02-04 19:12:49,915 DEBUG [java.sql.ResultSet] <== Row: 01, java
      이렇게 나오죠.ㅠㅠ
      정말 다 따라하고 삼일째 log4j를 이쁘게 출력하기위해....눈아파하는 중인데

    • jinwoo 2016.02.04 19:23

      pom.xml의 log4j와 log4jdbc-remix 이 jar추가 부분을 보여주실수 있으신가요?..

      • Favicon of https://addio3305.tistory.com BlogIcon 카루시에라 2016.02.22 11:49 신고

        log4j는 Maven 설치 시 기본으로 설정되어있을테고 log4jdbc-remix는
        <dependency>
        <groupId>org.lazyluke</groupId>
        <artifactId>log4jdbc-remix</artifactId>
        <version>0.2.7</version>
        </dependency>

        입니다.

    • 얼매 2016.02.05 15:12

      log4jdbc-remix 잘되는데 쿼리기 개행이 되지않는데 아무리 해도 안되서 질문좀 ibatis인데 ibats에서 개행이 적용되지않나요?

    • linuker 2016.03.31 17:04

      안녕하세요. 글 잘보구있습니다.!!
      저기위에 LoggerManageAspect 의 컨트롤러 dao, service 이 로그들은 어떻게 찍은건지 궁금합니다.!!

    • 2016.07.28 18:09

      비밀댓글입니다

    • dkffuwntpdy 2016.07.31 14:22

      LoggerManageAspect 의 컨트롤러 dao, service 이 로그들은 어떻게 찍은건지 궁금합니다.!!
      저도 알려주세요.

    • 뒹구르르 2017.01.23 15:57

      따라만 했는데 로그가 잘 나오네요^^ 감사합니다.

    • gore 2017.03.17 10:17

      이 글을 보고 나도 SQL문을 콘솔창에 찍어봐야지~ㅎㅎ
      하다가 아무런 오류없이 로그가 안찍히는 고통받는 분들을 위해 글써봅니다.

      저도 엄청 고통받았습니다만 SQL을 콘솔창에 출력해 주도록 하는 드라이버가 따로 있습니다.
      이 글에서 log4jdbc-remix를 사용하는데요, 저같은 경우 그 안에 DriverSpy로 설정해서 겨우 해결했습니다.
      자세한 건 구글에 치면 다 나와여...

      또한 dataSource에서 URL 설정도 그냥 하면 안되고 jdbc:log4j:기타등등 식으로 작성해야 하더군요.
      이게 remix 개발사이트에서 설정법에 그대로 나와 있는 부분입니다...

      참고로 log4jdbc-remix는 진짜 그냥 예쁘게 정렬해 주는 놈이고 log4jdbc를 써도 출력은 가능합니다.

      그리고 log4jdbc-remix는 플젝기간이 끝난 넘이고 개발자는 log4jdbc-log4j2라는 새로운 넘을 강추하더군요.
      적절하게 다운받고 설명에 적힌대로(영어지만 간단함) 하면 됩니다.
      해괴한 이름을 가진 이 넘은 보시는 바와 같이 log4j 2를 기반으로 하는 로거입니다.
      slf4j와 log4j2가 독립적으로 사용가능하고 log4j 2라는 심플한 로거를 사용해서 쓰기 좋습니다.

    • 소심보이 2018.05.08 10:41

      멀티 db의 경우에는 어떻게 해야하죠? 제가 동일하게 3개를 설정했더니 세번째 sql prefix만 먹히네요..

    • 박지훈 2018.09.05 14:01

      좋은 글입니다. 잘배우고 갑니다!

Designed by Tistory.