개요
Spring Boot 애플리케이션에서 다중 데이터베이스 환경(Primary, Replication DB 여러대)을 운영하면서 스케줄러를 통해 데이터를 INSERT, UPDATE, DELETE하는 과정에서 실제 데이터베이스에 변경사항이 반영되지 않는 문제를 경험했습니다. 이는 트랜잭션 관리 방식의 차이에서 기인한 문제일 수 있습니다.
해당 포스트에서는 제가 주로 사용한 두 가지 트랜잭션 관리자 DataSourceTransactionManager와 JpaTransactionManager에 대해 비교해보고 어떻게 위 문제를 해결했는지 기록합니다.
트랜잭션 관리자 비교
DataSourceTransactionManager
- 이 트랜잭션 관리자는 주로 JDBC API를 사용할 때 적합하며, 각 트랜잭션은 단일 데이터베이스 연결에 직접 연결됩니다.
- JDBC 수준에서 데이터베이스 연결의 트랜잭션을 관리하며, JPA와의 통합이 항상 최적화되어 있지 않습니다.
JpaTransactionManager
- JPA를 사용하는 환경에서 권장되는 트랜잭션 관리자로, EntityManager와의 트랜잭션을 자동으로 동기화하고, JPA 세션을 원활하게 관리합니다.
- EntityManager를 통한 모든 데이터 접근과 변동 사항이 트랜잭션 범위 안에서 안전하게 관리됩니다.
다중 데이터베이스 환경에서의 트랜잭션 문제
다중 데이터베이스 환경에서 스케줄러를 사용하여 데이터를 조작할 경우, DataSourceTransactionManager를 사용하면 예상치 못한 문제가 발생할 수 있습니다. 특히, INSERT, UPDATE, DELETE 작업 후 데이터가 최종적으로 데이터베이스에 반영되지 않는 현상은 다음과 같은 이유로 발생할 수 있습니다:
- 트랜잭션 동기화 문제 : DataSourceTransactionManager는 JPA의 EntityManager와 완전히 동기화되지 않아, JPA의 1차 캐시와 데이터베이스 사이에 일관성 문제가 발생할 수 있습니다.
- 롤백 처리 : JPA 작업 중 오류가 발생하면 EntityManager는 롤백을 시도하지만, 이 과정이 DataSourceTransactionManager와 완벽하게 동기화되지 않을 경우, 데이터베이스에 변경사항이 반영되지 않습니다.
해결 방안 : JpaTransactionManager의 도입
JpaTransactionManager를 사용하면 위와 같은 문제를 효과적으로 해결할 수 있습니다. JpaTransactionManager는 JPA의 EntityManager와의 트랜잭션을 자동으로 동기화하며, 데이터베이스와 JPA 사이의 일관성을 유지합니다. 또한, 모든 트랜잭션이 EntityManager를 통해 관리되므로, INSERT, UPDATE, DELETE 작업이 트랜잭션 커밋 시 데이터베이스에 정확히 반영됩니다.
결론
다중 데이터베이스 환경에서 JPA를 활용하여 데이터 관리를 수행하는 Spring Boot 애플리케이션에서는 JpaTransactionManager의 사용을 추천
'Java & Spring Boot' 카테고리의 다른 글
[Java] Multithreading 기본 개념 - 응답 속도 & 성능 향상 이해하기 (0) | 2024.11.23 |
---|---|
[Spring Boot] JWT(Access Token, Refresh Token) RTR 구현 (0) | 2024.11.02 |
[Java] Generic 동작 원리 및 용도 (1) | 2024.02.12 |
[Java] .stream() 동작 원리 및 용도 (0) | 2024.02.12 |
[Java] MockBean을 통한 테스트 (0) | 2024.01.27 |