MyBatis

Mybatis 콘솔에 쿼리문 및, 결과 출력-

Jungsoomin :) 2020. 7. 19. 00:03

이클립스의 콘솔창에서 mybatis의 쿼리와 실행결과를 보여주는 방법에 대해 기술한다.

  • log4jdbc-remix 의 의존을 추가한다.

  • Log4JdbcProxyDataSource 를 Bean으로 등록해 DataSourceBean에 감싸준다. << 생성자아규먼트

  • Log4JdbcProxyDataSource 의 format을 변경할 수 있는 Log4JdbcCustomFormatter 를 Bean으로 만들고 설정한다.

  • Log4JdbcProxyDataSource 에 setter 프로퍼티로 Log4JdbcCustomFormatter 의 매개값으로 준다.

  • SqlSessionFactoryBean 생성시 DataSource Log4jdbcProxtyDataSource 로 준다.

  • log4j.xml 파일에 appender 및  설정을 추가한다.

까지다. 나는 javaConfig 로 Bean을 관리하는데 그나마...익숙하므로, javaConfig로 진행했다.


1.log4jdbc-remix 의 의존을 추가한다.

 <dependency>
      <groupId>org.lazyluke</groupId>
       <artifactId>log4jdbc-remix</artifactId>
        <version>0.2.7</version>
         </dependency>

2.Log4JdbcProxyDataSourceBean으로 등록DataSourceBean에 감싸준다.

AOP에 대해 공부했으므로, 프록시가 먼저 가로채서 작동하며 JoinPoint에 흐름을 넘긴다는 것을 안다.

@Bean(destroyMethod = "close")
	public DataSource dataSource() {
		BasicDataSource ds = new BasicDataSource();
		ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
		ds.setUrl("jdbc:mysql://127.0.0.1:3306/스키마명?serverTimezone=UTC&useSSL=false&characterEncoding=utf8");
		ds.setUsername("spring5");
		ds.setPassword("spring5");
		ds.setInitialSize(2);
		ds.setMaxTotal(10);
		ds.setTestWhileIdle(true);
		ds.setMinEvictableIdleTimeMillis(60 * 1000 * 3);
		ds.setTimeBetweenEvictionRunsMillis(10 * 1000);
		return ds;
	}

@Bean
	public Log4jdbcProxyDataSource Log4DataSource() {
		Log4jdbcProxyDataSource ld = new Log4jdbcProxyDataSource(dataSource());
		ld.setLogFormatter(logFomatter());
		return ld;
	}

프록시 객체로 dataSoruce를 감싼다고 상상하기 좋다.


3.Log4JdbcProxyDataSource 의 format을 변경할 수 있는 Log4JdbcCustomFormatter 를 Bean으로 만들고 설정 한다.

@Bean
	Log4JdbcCustomFormatter logFomatter() {
		Log4JdbcCustomFormatter logFomatter = new Log4JdbcCustomFormatter();
		logFomatter.setLoggingType(LoggingType.MULTI_LINE);
		logFomatter.setSqlPrefix("SQL         :    ");
		return logFomatter;
	}

LoggingType 의 상수와 접두사인 Prefix 를 setter 프로퍼티로 설정하고 Bean으로 등록 한다.

 


4.Log4JdbcProxyDataSource 에 setter 프로퍼티로 Log4JdbcCustomFormatter 를 매개값으로 준다. 

@Bean
	public Log4jdbcProxyDataSource Log4DataSource() {
		Log4jdbcProxyDataSource ld = new Log4jdbcProxyDataSource(dataSource());
		ld.setLogFormatter(logFomatter());
		return ld;
	}

dataSource 객체는 생성자 로 , Log4JdbcCustomFormatter 는 setter로 준다.

 


5.SqlSessionFactoryBean 생성시 DataSource를 Log4jdbcProxtyDataSource로 준다.

드디어 아는 객체가 나왔다. SqlSessionFactory의 구현객체인 SqlSessionFactoryBean을 만들때 주던 setter프로퍼티에 

Log4jdbcProxtyDataSource 를 주면되겠다.

@Bean
	public SqlSessionFactoryBean sqlSessionFactory(Log4jdbcProxyDataSource dataSource) throws Exception {
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(dataSource);
		factoryBean.setConfigLocation(applicationContext.getResource("classpath:/mybatis/mybatis-config.xml"));
		factoryBean.setMapperLocations(applicationContext.getResources("classpath:/mybatis/mappers/*.xml"));
		return factoryBean;
	}

6.Log4j.xml 파일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>
    
    ....
    
    
     <!-- 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="debug"/>  
        <appender-ref ref="console"/>  
    </logger>  





  
 
    <!-- Root Logger -->
    <root>
        <priority value="off" />
        <appender-ref ref="console" />
    </root>

appender를 추가해주고, Query문에 대한 logger를 추가해준다. sqlonly 로거는 추가한 appender 인 console-infolog 를 참하고 있는 것이 보인다.  root 로거는 보기 복잡하므로 꺼주자.

 


쿼리문이 콘솔에 출력된다.