iBatis 등의 쿼리 로그를 볼때 SQL 문과 Parameter 부분이 따로 표시되어서
실제 쿼리를 테스트 하려면 일일이 맵핑등의 수작업이 필요합니다.
해당 과정을 처리한후 로그로 뽑아주는 Lib가 있어서 소개합니다.
적용시 크게 다른점은 없으며, logback or log4j 의 Log 프로퍼티의 변경 및 DB Driver, URL 변경만 작업해주면 됩니다.
# 해당 라이브러리가 한번 감싸서 다시 호출하는 방식으로 실제 해당 라이브러리는 개발시에만 사용!! 하세요. 아무래도 재호출 개념이 있다보니 약간이나마 시간적 소모가 걸리는 부분이 존재 할 수 도 있습니다.
관련 사이트 : http://code.google.com/p/log4jdbc/
log4jdbc3 의 경우 JDK1.4 and JDK1.5
log4jdbc4 의 경우 JDK1.6 and JDK1.7 용입니다.
# 적용방법
JDBC Dirver 와, URL, Logback(log4j) 프로퍼티 변경
(적용전)
spp.jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
spp.jdbc.url=jdbc:oracle:thin:@localhost:1521:ora
(적용후)
spp.jdbc.driverClassName=net.sf.log4jdbc.DriverSpy
spp.jdbc.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:ora
- Logback.xml
<!-- 관련 정보 http://magefister.egloos.com/2053938 -->
<logger name="java.sql">
<level value="ERROR"/>
</logger>
<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
<logger name="jdbc.sqlonly">
<level value="debug"/>
</logger>
<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
<logger name="jdbc.sqltiming">
<level value="debug"/>
</logger>
<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
<logger name="jdbc.audit">
<level value="error"/>
</logger>
<!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
<logger name="jdbc.resultset">
<level value="error"/>
</logger>
# 지원 가능한 DB 종류
Driver Class | Database Type |
oracle.jdbc.driver.OracleDriver | Older Oracle Driver |
oracle.jdbc.OracleDriver | Newer Oracle Driver |
com.sybase.jdbc2.jdbc.SybDriver | Sybase |
net.sourceforge.jtds.jdbc.Driver | jTDS SQL Server & Sybase driver |
com.microsoft.jdbc.sqlserver.SQLServerDriver | Microsoft SQL Server 2000 driver |
com.microsoft.sqlserver.jdbc.SQLServerDriver | Microsoft SQL Server 2005 driver |
weblogic.jdbc.sqlserver.SQLServerDriver | Weblogic SQL Server driver |
com.informix.jdbc.IfxDriver | Informix |
org.apache.derby.jdbc.ClientDriver | Apache Derby client/server driver, aka the Java DB |
org.apache.derby.jdbc.EmbeddedDriver | Apache Derby embedded driver, aka the Java DB |
com.mysql.jdbc.Driver | MySQL |
org.postgresql.Driver | PostgresSQL |
org.hsqldb.jdbcDriver | HSQLDB pure Java database |
org.h2.Driver | H2 pure Java database |
--기존 Sql Log --
[DEBUG] [http-bio-8080-exec-5] java.sql.Connection - {conn-101110} Connection
[DEBUG] [http-bio-8080-exec-5] java.sql.Connection - {conn-101110} Preparing Statement: SELECT order_index orderIndex, id boardId, title, description, create_id createId, to_char(create_dt, 'yyyymmddhh24miss') createDt, start_dt startDt, end_dt endDt, company FROM test_board WHERE id > '0' AND ( company = ? or share_yn = 0 ) AND (start_dt = 'continue' OR TO_CHAR (SYSDATE, 'yyyymmddhh24miss') BETWEEN start_dt AND end_dt) ORDER BY end_dt DESC, start_dt DESC, create_dt DESC
[DEBUG] [http-bio-8080-exec-5] java.sql.PreparedStatement - {pstm-101111} Executing Statement: SELECT order_index orderIndex, id boardId, title, description, create_id createId, to_char(create_dt, 'yyyymmddhh24miss') createDt, start_dt startDt, end_dt endDt, company FROM test_board WHERE id > '0' AND ( company = ? or share_yn = 0 ) AND (start_dt = 'continue' OR TO_CHAR (SYSDATE, 'yyyymmddhh24miss') BETWEEN start_dt AND end_dt) ORDER BY end_dt DESC, start_dt DESC, create_dt DESC
[DEBUG] [http-bio-8080-exec-5] java.sql.PreparedStatement - {pstm-101111} Parameters: [SHB]
[DEBUG] [http-bio-8080-exec-5] java.sql.PreparedStatement - {pstm-101111} Types: [java.lang.String]
-- log4jdbc 로 변경시 Log --
(실행쿼리)
2. SELECT order_index orderIndex, id boardId, title, description, create_id createId, to_char(create_dt,
'yyyymmddhh24miss') createDt, start_dt startDt, end_dt endDt, company FROM test_board WHERE id > '0' AND ( company = 'SHB' or share_yn = 0 ) AND (start_dt = 'continue' OR TO_CHAR
(SYSDATE, 'yyyymmddhh24miss') BETWEEN start_dt AND end_dt) ORDER BY end_dt DESC, start_dt DESC,
create_dt DESC
{executed in 3 msec} (실행시간)