sql logging 처리 변경...

jdk1.8 버전 lib 버그로 인해 datasource-proxy 사용
dev
박성영 4 months ago
parent 34ec675661
commit 5c72f37b8b

@ -134,6 +134,10 @@ dependencies {
// ===== sqlPaser =====
implementation 'com.github.jsqlparser:jsqlparser:4.5'
// ===== DataSource Proxy =====
// datasource-proxy -
implementation 'net.ttddyy:datasource-proxy:1.8.1'
// ===== Mail =====
implementation 'org.springframework.boot:spring-boot-starter-mail'

@ -1,27 +1,88 @@
package egovframework.config;
import lombok.extern.slf4j.Slf4j;
import net.ttddyy.dsproxy.listener.logging.SLF4JLogLevel;
import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
/**
* MyBatis Configuration
* MyBatis Configuration with DataSource Proxy
*
* This class configures MyBatis by adding custom interceptors.
* datasource-proxy include
*
*/
@Slf4j
@Configuration
@Profile({"local", "dev"}) // local과 dev 프로파일에서만 활성화
//@Profile({"local", "dev"}) // local과 dev 프로파일에서만 활성화
public class MyBatisConfig {
/**
* Customizes the MyBatis configuration by adding the query interceptor.
* DataSource Properties
*/
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
/**
* DataSource ( )
*/
@Bean
@ConfigurationProperties("spring.datasource.hikari")
public DataSource actualDataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
/**
* DataSource Proxy
*
* datasource-proxy
* - (if, choose )
* - include
* -
*/
@Bean
@Primary
public DataSource dataSource(@Qualifier("actualDataSource") DataSource actualDataSource) {
return ProxyDataSourceBuilder
.create(actualDataSource)
.name("XIT-Framework-DataSource")
// 쿼리 로깅 리스너 설정 - 실행된 모든 쿼리와 파라미터 바인딩 결과 로깅
.logQueryBySlf4j(SLF4JLogLevel.INFO, "go.kr.project.sql.query")
// 멀티라인으로 쿼리 포맷팅하여 가독성 향상
.multiline()
.build();
}
/**
* MyBatis Query Interceptor
*/
@Autowired
private MyBatisQueryInterceptor myBatisQueryInterceptor;
/**
* MyBatis Configuration Customizer
*
* @param interceptor The MyBatis query interceptor
* @return A ConfigurationCustomizer that adds the interceptor to MyBatis
* MyBatis
* datasource-proxy
*/
@Bean
public ConfigurationCustomizer mybatisConfigurationCustomizer(MyBatisQueryInterceptor interceptor) {
return configuration -> configuration.addInterceptor(interceptor);
public ConfigurationCustomizer mybatisConfigurationCustomizer() {
return configuration -> {
// 커스텀 쿼리 인터셉터 추가
configuration.addInterceptor(myBatisQueryInterceptor);
log.info("MyBatis Query Interceptor가 등록되었습니다 - 상세 쿼리 분석 활성화");
};
}
}

@ -23,7 +23,6 @@ import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
@ -35,12 +34,14 @@ import java.util.stream.Collectors;
/**
* MyBatis Query Interceptor
*
* This interceptor logs detailed information about SQL queries executed by MyBatis,
* including the original SQL, actual SQL with parameters, and parameter values.
*
* datasource-proxy
* -
* - include
* -
*/
@Component
@Profile({"local", "dev"}) // local과 dev 프로파일에서만 활성화
//@Profile({"local", "dev"}) // local과 dev 프로파일에서만 활성화
@Intercepts({
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})

@ -90,7 +90,8 @@ logging:
max-history: 30
level:
org.springframework: INFO
go.kr.project: INFO
go.kr.project: DEBUG
go.kr.project.sql.query: OFF
egovframework: DEBUG
org.mybatis: INFO

@ -96,6 +96,7 @@ logging:
level:
org.springframework: INFO
go.kr.project: DEBUG
go.kr.project.sql.query: OFF
egovframework: DEBUG
org.mybatis: INFO

@ -91,6 +91,7 @@ logging:
level:
org.springframework: INFO
go.kr.project: INFO
go.kr.project.sql.query: OFF
egovframework: INFO
org.mybatis: INFO

@ -19,7 +19,7 @@ spring:
max-request-size: 50MB
resolve-lazily: false # 즉시 처리하여 빠른 에러 응답
profiles:
active: local
active: prd
application:
name: xit-framework
mvc:

@ -54,6 +54,24 @@
<!-- 로컬 환경에서만 적용되는 설정 -->
<springProfile name="local">
<!-- datasource-proxy 쿼리 로깅 설정 -->
<logger name="go.kr.project.sql.query" level="INFO" additivity="false">
<appender-ref ref="CONSOLE_COLOR" />
<appender-ref ref="ASYNC_FILE" />
</logger>
<!-- MyBatis 쿼리 인터셉터 로깅 설정 -->
<logger name="egovframework.config.MyBatisQueryInterceptor" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE_COLOR" />
<appender-ref ref="ASYNC_FILE" />
</logger>
<!-- MyBatis SQL 로깅 설정 -->
<logger name="org.mybatis" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE_COLOR" />
<appender-ref ref="ASYNC_FILE" />
</logger>
<!-- 로컬 환경에서는 컬러 콘솔 사용 -->
<root level="INFO">
<appender-ref ref="CONSOLE_COLOR" />
@ -63,6 +81,24 @@
<!-- 개발 환경에서만 적용되는 설정 -->
<springProfile name="dev">
<!-- datasource-proxy 쿼리 로깅 설정 -->
<logger name="go.kr.project.sql.query" level="INFO" additivity="false">
<appender-ref ref="CONSOLE_COLOR" />
<appender-ref ref="ASYNC_FILE" />
</logger>
<!-- MyBatis 쿼리 인터셉터 로깅 설정 -->
<logger name="egovframework.config.MyBatisQueryInterceptor" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE_COLOR" />
<appender-ref ref="ASYNC_FILE" />
</logger>
<!-- MyBatis SQL 로깅 설정 -->
<logger name="org.mybatis" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE_COLOR" />
<appender-ref ref="ASYNC_FILE" />
</logger>
<!-- 개발 환경에서는 컬러 콘솔 사용 -->
<root level="INFO">
<appender-ref ref="CONSOLE_COLOR" />

@ -73,6 +73,14 @@
REG_DTTM
FROM
tb_login_log
<include refid="listWhere"/>
ORDER BY LOGIN_DTTM DESC
<if test='pagingYn != null and pagingYn == "Y"'>
LIMIT #{startIndex}, #{perPage}
</if>
</select>
<sql id="listWhere">
<where>
<if test="searchUserAcnt != null and searchUserAcnt != ''">
AND USER_ACNT like concat('%',#{searchUserAcnt},'%')
@ -90,11 +98,7 @@
AND DEVICE_INFO like concat('%',#{searchDeviceInfo},'%')
</if>
</where>
ORDER BY LOGIN_DTTM DESC
<if test='pagingYn != null and pagingYn == "Y"'>
LIMIT #{startIndex}, #{perPage}
</if>
</select>
</sql>
<!-- 조건에 맞는 로그인 로그 개수 조회 -->
<select id="selectLoginLogCount" parameterType="LoginLogSearchVO" resultType="int">
@ -102,23 +106,7 @@
COUNT(*)
FROM
tb_login_log
<where>
<if test="searchUserAcnt != null and searchUserAcnt != ''">
AND USER_ACNT like concat('%',#{searchUserAcnt},'%')
</if>
<if test="searchSuccessYn != null and searchSuccessYn != ''">
AND SUCCESS_YN = #{searchSuccessYn}
</if>
<if test="searchStartDt != null and searchStartDt != ''">
AND LOGIN_DTTM >= STR_TO_DATE(CONCAT(#{searchStartDt},' 00:00:00'), '%Y-%m-%d %H:%i:%s')
</if>
<if test="searchEndDt != null and searchEndDt != ''">
AND LOGIN_DTTM &lt;= STR_TO_DATE(CONCAT(#{searchEndDt},' 23:59:59'), '%Y-%m-%d %H:%i:%s')
</if>
<if test="searchDeviceInfo != null and searchDeviceInfo != ''">
AND DEVICE_INFO like concat('%',#{searchDeviceInfo},'%')
</if>
</where>
<include refid="listWhere"/>
</select>
<!-- 특정 사용자의 최근 로그인 기록 조회 -->

Loading…
Cancel
Save