-
logback 로그 설정Language/Java 2024. 10. 29. 10:51
P6spy문제
p6spy를 활용해서 로그를 설정해서 사용을 하였더니 문제가 발생하였다.
@Transactional(readOnly = true)
public void testReadOnly() {
}
이렇게 설정하게 되면TransactionSynchronizationManager.isCurrentTransactionReadOnly()가 true이고 아래 ReplicationRoutingDataSource 로직에 따라 secondaries DB를 바로 보게 되어야 하는데 testReadOnly 메소드 안에서 TransactionSynchronizationManager.isCurrentTransactionReadOnly()를 찍어보면 true가 리턴되는데 ReplicationRoutingDataSource에 설정된 determineCurrentLookupKey에서는 false가 리턴되지 않아서 의도하지 않은 primary DB로 접근하게 되었다.
할일 많으니 정확한 원인은 나중에 찾고 급한대로 p6spy설정된 부분들을 모두 제거하고 logback방식으로 변경해보자.
@Slf4j public class ReplicationRoutingDataSource extends AbstractRoutingDataSource { private final ReadOnlyDataSourceCycle<Object> readOnlyDataSourceCycle = new ReadOnlyDataSourceCycle<>(); @Override public void setTargetDataSources(Map<Object, Object> targetDataSources) { super.setTargetDataSources(targetDataSources); List<Object> readOnlyDataSourceLookupKeys = targetDataSources.keySet().stream().toList(); readOnlyDataSourceCycle.setReadOnlyDataSourceLookupKeys(readOnlyDataSourceLookupKeys); } @Override public Object determineCurrentLookupKey() { if (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) { Object key = readOnlyDataSourceCycle.getReadOnlyDataSourceLookupKey(); return key; } // readOnly가 아니면 (null을 반환하면) defaultDatasource를 사용한다. return null; } } secondaries
Logback으로 변경
- logback.xml
<?xml version="1.0" encoding="UTF-8" ?> <configuration> ... <!-- Hibernate SQL 쿼리 로깅 설정 --> <logger name="org.hibernate.SQL" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </logger> ... </configuration>
- application.yml
spring: jpa: show-sql: true
'Language > Java' 카테고리의 다른 글
p6spy 로그 설정 방법 (1) 2024.09.27 Batch에서 FCM 발송 오류 트러블슈팅 (2) 2024.09.12 springboot 3.x + JPA + QueryDSL에서 p6spy 적용 (1) 2024.09.05 비트마스크 적용 (QueryDSL & Hibernate 6.x) (0) 2024.08.28 SpringBoot에서 QueryDSL 설정 및 사용 (0) 2024.08.16