잘못된 내용이나 더 나은 방식 등에 대한 의견은 댓글로 피드백 부탁드리겠습니다. :)
<!-- test 환경 구성 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.9.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.5.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>0.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
<scope>test</scope>
</dependency>
java.lang.NoClassDefFoundError: com/jayway/jsonpath/InvalidPathException
// 2.4.0 버전으로 동작시 예외 발생
java.lang.NoSuchMethodError: com.jayway.jsonpath.JsonPath.compile(Ljava/lang/String;[Lcom/jayway/jsonpath/Filter;)Lcom/jayway/jsonpath/JsonPath;
scope = test
인 경우에는 log가 출력되지 않는 문제가 있어 다음 라이브러리로 대체하였습니다.MockHttpSession
객체를 생성하게 되는데 이 때 서블릿 버전 3.1 이하에서는 SessionCookieConfig 클래스를 찾지 못하는 오류가 발생하기 때문에 변경이 필요합니다.java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig
아래 링크의 web-app xxx 관련 파일을 확인하면 schema(DTD) 에 대한 자세한 내용을 확인할 수 있습니다.
web-app 2.5
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="servlet-2_5"
version="2.5">
</web-app>
web-app 3.0
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
web-app 3.1
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
web-app 4.0
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
<!-- <dependency>-->
<!-- <groupId>javax.servlet</groupId>-->
<!-- <artifactId>servlet-api</artifactId>-->
<!-- <scope>provided</scope>-->
<!-- <version>2.5</version>-->
<!-- </dependency>-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--<installed facet="jst.web" version="2.5"/>-->
<installed facet="jst.web" version="3.1"/>
scope = test 일 때 실행 시 DB Transaction 관련 로그를 확인할 수 있도록 의존성을 추가하였습니다.
test 환경에서 log 출력을 위해 다음과 같이 파일을 구성하였습니다.
log4j2.properties 파일에는 아래의 설정을 입력하였습니다.
// 필수 입력
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
// sql = mySQL
log4jdbc.drivers=com.mysql.jdbc.Driver
// 잘리는 log가 없도록 제한 해제 (0)
log4jdbc.dump.sql.maxlinelength=0
해당 logger가 transaction을 읽어들이기 위해서는 dataSource의 driverclass와 url를 수정하여야 한다.
// 기존 설정
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="core.log.jdbc.driver.MysqlDriver"/>
<property name="url" value="jdbc:mysql://--" />
...
</bean>
// 수정 후
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
<property name="url" value="jdbc:log4jdbc:mysql://--"
</bean>
log4j2-test.xml 를 생성하여 test 실행 시 log 출력을 설정하였습니다.
log4jdbc2에서는 sqlonly
, sqltiming
, audit
, resultset
, resultsettable
, connection
출력을 지원합니다.
<!-- log SQL with timing information, post execution -->
<logger name="log4jdbc.log4j2" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<AppenderRef ref="console" />
</logger>
<logger name="jdbc.sqltiming" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</logger>
<logger name="jdbc.audit" level="OFF" additivity="false">
<AppenderRef ref="console" />
</logger>
<logger name="jdbc.resultset" level="OFF" additivity="false">
<AppenderRef ref="console" />
</logger>
<logger name="jdbc.resultsettable" level="INFO" additivity="false">
<AppenderRef ref="console" />
</logger>
<logger name="jdbc.connection" level="OFF" additivity="false">
<AppenderRef ref="console" />
</logger>
자세한 설정 방법은 다음 링크에서 확인할 수 있습니다. https://log4jdbc.brunorozendo.com/