콘텐츠

JDBC setReadOnly 호출 이슈 해결기

스토리 · 인프런 테크 · 2024.09.02

AWS Aurora PostgreSQL 환경에서 Spring Boot를 사용할 때, 특정 API에서 간헐적으로 발생하는 `setReadOnly` 에러의 원인을 분석하고 해결한 사례를 공유합니다. 핀포인트(Pinpoint) 로그를 통해 에러가 트랜잭션의 commit 및 close 과정에서 발생함을 확인하였고, 원인 분석 결과 AWS JDBC Wrapper의 Failover 플러그인이 클러스터 상태를 확인하기 위해 수행하는 topology query가 문제의 핵심임을 밝혀냈습니다. 이 쿼리가 실행되는 동안 트랜잭션 상태가 `IDLE`에서 `OPEN`으로 변경되면서, 이후 호출되는 `setReadOnly` 메서드와 충돌을 일으키는 것이었습니다. 이를 해결하기 위해 `LazyConnectionDataSourceProxy`의 `setReadOnlyDataSource` 기능을 활용하여, `@Transactional(readOnly = true)` 설정에 따라 읽기 전용 DataSource를 적절히 분기하도록 구성하여 문제를 해결하였습니다.