|
|
|
|
@ -171,53 +171,59 @@ public class DataSourceProxyConfig {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void afterQuery(ExecutionInfo execInfo, List<QueryInfo> queryInfoList) {
|
|
|
|
|
// 쿼리 실행 후 파라미터가 바인딩된 SQL 출력
|
|
|
|
|
for (QueryInfo queryInfo : queryInfoList) {
|
|
|
|
|
String query = queryInfo.getQuery();
|
|
|
|
|
List<List<ParameterSetOperation>> parametersList = queryInfo.getParametersList();
|
|
|
|
|
|
|
|
|
|
// Mapper 경로 및 메서드명 추출
|
|
|
|
|
String mapperInfo = extractMapperInfo();
|
|
|
|
|
logger.info(" ========================== Mapper: {} ========================== ", mapperInfo);
|
|
|
|
|
|
|
|
|
|
// 쿼리 실행 시간 및 기본 정보
|
|
|
|
|
long executionTime = execInfo.getElapsedTime();
|
|
|
|
|
logger.debug("실행 시간: {}ms", executionTime);
|
|
|
|
|
|
|
|
|
|
// 파라미터 값 추출
|
|
|
|
|
List<Object> parameterValues = extractParameterValues(parametersList);
|
|
|
|
|
|
|
|
|
|
// 파라미터 개수 정보
|
|
|
|
|
int questionMarkCount = countQuestionMarks(query);
|
|
|
|
|
logger.debug("파라미터 정보: ? 플레이스홀더 {}개, 바인딩 값 {}개", questionMarkCount, parameterValues.size());
|
|
|
|
|
|
|
|
|
|
// 파라미터 값들 전체 출력 (인덱스 포함)
|
|
|
|
|
if (!parameterValues.isEmpty()) {
|
|
|
|
|
logger.debug("파라미터 값 목록 (총 {}개):", parameterValues.size());
|
|
|
|
|
for (int i = 0; i < parameterValues.size(); i++) {
|
|
|
|
|
Object param = parameterValues.get(i);
|
|
|
|
|
String paramValue;
|
|
|
|
|
|
|
|
|
|
if (param == null) {
|
|
|
|
|
paramValue = "NULL";
|
|
|
|
|
} else if (param instanceof String) {
|
|
|
|
|
paramValue = "'" + param.toString() + "'";
|
|
|
|
|
} else {
|
|
|
|
|
paramValue = param.toString();
|
|
|
|
|
try {
|
|
|
|
|
// 쿼리 실행 후 파라미터가 바인딩된 SQL 출력
|
|
|
|
|
for (QueryInfo queryInfo : queryInfoList) {
|
|
|
|
|
String query = queryInfo.getQuery();
|
|
|
|
|
List<List<ParameterSetOperation>> parametersList = queryInfo.getParametersList();
|
|
|
|
|
|
|
|
|
|
// Mapper 경로 및 메서드명 추출
|
|
|
|
|
String mapperInfo = extractMapperInfo();
|
|
|
|
|
logger.info(" ========================== Mapper: {} ========================== ", mapperInfo);
|
|
|
|
|
|
|
|
|
|
// 쿼리 실행 시간 및 기본 정보
|
|
|
|
|
long executionTime = execInfo.getElapsedTime();
|
|
|
|
|
logger.debug("실행 시간: {}ms", executionTime);
|
|
|
|
|
|
|
|
|
|
// 파라미터 값 추출
|
|
|
|
|
List<Object> parameterValues = extractParameterValues(parametersList);
|
|
|
|
|
|
|
|
|
|
// 파라미터 개수 정보
|
|
|
|
|
int questionMarkCount = countQuestionMarks(query);
|
|
|
|
|
logger.debug("파라미터 정보: ? 플레이스홀더 {}개, 바인딩 값 {}개", questionMarkCount, parameterValues.size());
|
|
|
|
|
|
|
|
|
|
// 파라미터 값들 전체 출력 (인덱스 포함)
|
|
|
|
|
if (!parameterValues.isEmpty()) {
|
|
|
|
|
logger.debug("파라미터 값 목록 (총 {}개):", parameterValues.size());
|
|
|
|
|
for (int i = 0; i < parameterValues.size(); i++) {
|
|
|
|
|
Object param = parameterValues.get(i);
|
|
|
|
|
String paramValue;
|
|
|
|
|
|
|
|
|
|
if (param == null) {
|
|
|
|
|
paramValue = "NULL";
|
|
|
|
|
} else if (param instanceof String) {
|
|
|
|
|
paramValue = "'" + param.toString() + "'";
|
|
|
|
|
} else {
|
|
|
|
|
paramValue = param.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 파라미터 인덱스와 함께 출력
|
|
|
|
|
logger.debug(" (parameter {}) = {}", i + 1, paramValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 파라미터 인덱스와 함께 출력
|
|
|
|
|
logger.debug(" (parameter {}) = {}", i + 1, paramValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 파라미터 바인딩된 SQL 생성
|
|
|
|
|
String boundQuery = bindParameters(query, parameterValues);
|
|
|
|
|
|
|
|
|
|
// SQL 포맷팅 적용 (jsqlparser 사용)
|
|
|
|
|
String formattedQuery = formatSql(boundQuery);
|
|
|
|
|
|
|
|
|
|
logger.info("\n{}\n", formattedQuery);
|
|
|
|
|
// 파라미터 바인딩된 SQL 생성
|
|
|
|
|
String boundQuery = bindParameters(query, parameterValues);
|
|
|
|
|
|
|
|
|
|
// SQL 포맷팅 적용 (jsqlparser 사용)
|
|
|
|
|
String formattedQuery = formatSql(boundQuery);
|
|
|
|
|
|
|
|
|
|
logger.info("\n{}\n", formattedQuery);
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
// ThreadLocal 정리 (메모리 누수 방지)
|
|
|
|
|
// 쿼리 로깅이 완료된 후 반드시 정리
|
|
|
|
|
SqlLoggingInterceptor.clearCurrentMapperInfo();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|