web

코드로 배우는 스프링 웹프로젝트 - log4jdbc-log4j2 설정

늉_늉 2020. 10. 1. 18:14

-MyBatis는 내부적으로 JDBC PreparedStatement 를 이용해서 SQL을 처리한다.

 

따라서 SQL에 전달되는 파라미터는 JDBC에서와 같이 ? 로 치환되어 처리된다.

 

 

복잡한 SQL의 경우 ? 로 나오는 값이 제대로 되었는지 확인하기 어렵기 때문에

 

이런 문제를 해결 하기 위해  PreparedStatement에 사용된  ? 가 어떤 값으로 처리되었는지 확인하는 기능을 추가해 주도록 한다.

 

 

SQL로그를 제대로 보기 위해서는 log4jdbc-log4j2라이브러리를 사용한다.

 

 

 

pom.xml을 수정해 준다.

 

 

		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>

 

 

1. 로그 설정 파일을 추가

 

2. JDBC 연결 정보 수정

 

 

1.

src/main/resource 밑에  log4jdbc.log4j2.properties

 

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegat

 

2.

log4jdbc를 이용하는 경우 JDBC드라이버와 URL정보를 수정 해야한다.

 

root-context.xml 일부를 아래와 같이 수정한다.

 

 

기존의 코드는 주석처리하고 작성해 주었다.

 

		<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
		<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"></property>
        

 

 

이전과 달리 JDBC와 관련된 로그들이 출력됨을  볼 수 있다.

 

 

 

 

 

 

 

Java 설정을 이용하는 경우 같은내용을 RootConfig 클래스에 아래와같이 반영한다.

 

주석을 치고 아래와 같이 작성 하였다.

 

package org.zerock.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@ComponentScan(basePackages = {"org.zerock.sample"})
@MapperScan(basePackages = {"org.zerock.mapper"})
public class RootConfig {
	
	@Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
//		hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
//		hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
		hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
		hikariConfig.setJdbcUrl("jdbc:log4jdbc:oracle:thin:@localhost:1521:XE");
		hikariConfig.setUsername("book_ex");
		hikariConfig.setPassword("book_ex");
		
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		
		return dataSource;
	}
	
	
	
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception{
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
		
		sqlSessionFactory.setDataSource(dataSource());
		return (SqlSessionFactory) sqlSessionFactory.getObject();
		
		
	}

}

 

 

 

로그 레벨의 설정

 

 

이렇게 하면 로그가 너무 많이 나오기 때문에 로그이 레벨을 이용해서  조금 수정을 해준다.

 

src/test/resource 밑에 log4.xml 을 이용한다.

 

	<logger name="jdbc.audit">
		<level value="warn" />
	</logger>
	
	<logger name="jdbc.resultset">
		<level value="warn" />
	</logger>
	
	<logger name="jdbc.connection">
		<level value="warn" />
	</logger>

 

 

기존의 로그는 info레벨이기 때문에  warn과 같이 좀더 높은 레벨의 로그만 기록하게 수정하면 테스트코드를 실행할때

 

이전에 비해 로그의 양이 줄어든다.