이전에는 ChainedTransactionManager를 사용 했는데 2.5버전 이후부터 Deprecated되어서 소스에 줄이 생기는 것이 보기 싫어서 JtaTransactionManager로 변경을 했습니다.
그리고 TransactionManager를 변경을 하면서 ChainedTransactionManager와 JtaTransactionManager의 동작 방식이 전혀 다르다는 것을 알게 되었습니다.
ChainedTransactionManager와 JtaTransactionManager는 모두 트랜잭션 관리를 위한 도구이지만, 사용 목적과 작동 방식에서 차이가 있습니다. 이 두 트랜잭션 매니저의 차이점을 설명하겠습니다.
1. JtaTransactionManager
개요
- **JtaTransactionManager**는 JTA(Java Transaction API)를 기반으로 하는 트랜잭션 매니저로, 분산 트랜잭션을 관리하기 위해 사용됩니다. JTA는 여러 자원을 사용하는 트랜잭션을 관리하기 위한 표준 Java API입니다.
- 사용 예: JTA는 주로 복수의 데이터베이스, 메시지 큐, 그리고 다른 자원 관리자들 간에 분산 트랜잭션을 처리해야 하는 엔터프라이즈 애플리케이션에서 사용됩니다.
주요 특징
- 글로벌 트랜잭션 관리: JTA는 여러 자원을 하나의 글로벌 트랜잭션으로 묶어 관리할 수 있습니다. 이는 예를 들어, 두 개 이상의 데이터베이스에 걸쳐서 하나의 트랜잭션을 실행할 때 유용합니다.
- 트랜잭션 관리자와의 통합: JtaTransactionManager는 JTA를 지원하는 애플리케이션 서버(예: WebLogic, WebSphere, JBoss)에서 주로 사용되며, 컨테이너 관리형 트랜잭션을 처리할 수 있습니다.
- 트랜잭션 전파: JtaTransactionManager는 트랜잭션 전파(Propagation)를 통해 트랜잭션 범위를 제어할 수 있으며, 이미 시작된 트랜잭션을 다른 자원으로 확장할 수 있습니다.
- 트랜잭션 격리 수준 제한: 기본적으로 JTA는 특정 격리 수준을 직접 지원하지 않으며, 이를 설정하려면 allowCustomIsolationLevels 옵션을 활성화해야 합니다.
2. ChainedTransactionManager
개요
- **ChainedTransactionManager**는 여러 개의 트랜잭션 매니저를 체인으로 연결하여 하나의 트랜잭션처럼 동작하도록 만드는 트랜잭션 매니저입니다. 이 매니저는 Spring Framework에서 제공되며, 서로 다른 트랜잭션 매니저를 순차적으로 실행하여 일관된 트랜잭션 처리를 가능하게 합니다.
- 사용 예: ChainedTransactionManager는 두 개 이상의 트랜잭션 매니저(예: DataSourceTransactionManager, JmsTransactionManager)를 함께 사용해야 하는 상황에서 사용됩니다.
주요 특징
- 복수의 로컬 트랜잭션 관리: 각 자원에 대해 로컬 트랜잭션 매니저를 사용하고, 이를 하나의 트랜잭션으로 묶어서 관리할 수 있습니다. 예를 들어, 하나의 데이터베이스와 JMS 메시지 브로커에 대해 각각의 트랜잭션 매니저를 사용하는 경우입니다.
- 순차적 트랜잭션 관리: ChainedTransactionManager는 순차적으로 등록된 트랜잭션 매니저를 실행합니다. 각 트랜잭션 매니저가 성공해야만 전체 트랜잭션이 성공으로 간주됩니다.
- 부분 실패 처리: 여러 트랜잭션 매니저 중 하나가 실패하면, 앞서 실행된 트랜잭션도 롤백되어야 합니다. 이 때문에 ChainedTransactionManager는 복잡한 트랜잭션 관리가 필요할 때 신중하게 사용해야 합니다.
주요 차이점
- 사용 목적:
- JtaTransactionManager: 분산 트랜잭션 관리(복수의 자원 관리자에 걸쳐 있는 트랜잭션)에서 주로 사용됩니다.
- ChainedTransactionManager: 여러 개의 로컬 트랜잭션 매니저를 하나의 트랜잭션으로 묶어서 관리할 때 사용됩니다.
- 작동 방식:
- JtaTransactionManager: 글로벌 트랜잭션을 관리하며, JTA를 지원하는 애플리케이션 서버 환경에서 주로 사용됩니다.
- ChainedTransactionManager: 여러 개의 트랜잭션 매니저를 체인으로 연결하여 순차적으로 트랜잭션을 처리합니다.
- 트랜잭션 범위:
- JtaTransactionManager: 전체 글로벌 트랜잭션 범위에서 모든 자원을 관리합니다.
- ChainedTransactionManager: 개별적으로 정의된 트랜잭션 매니저들을 하나의 연계된 트랜잭션으로 관리합니다.
- 격리 수준 지원:
- JtaTransactionManager: 기본적으로 격리 수준 설정을 지원하지 않으며, 필요 시 allowCustomIsolationLevels 옵션을 활성화해야 합니다.
- ChainedTransactionManager: 각 트랜잭션 매니저가 자신의 격리 수준을 관리합니다.
결론
- **JtaTransactionManager**는 주로 엔터프라이즈 애플리케이션에서 글로벌 분산 트랜잭션을 처리하는 데 사용됩니다.
- **ChainedTransactionManager**는 복수의 로컬 트랜잭션을 하나의 트랜잭션으로 묶어 관리해야 할 때 사용되며, Spring 환경에서 여러 자원에 걸친 트랜잭션을 처리할 때 유용합니다.
- **ChainedTransactionManager**은 하나의 트랜젝션으로 처리 되는 것이 아닌 트랜잭션 매니저를 하나로 묶어서 관리를 하기 때문에 트랜잭션이 실패를 할 수 있다.
- **JtaTransactionManager**은 트랜잭션 자원을 하나로 묶어서 글로벌로 관리를 하기 때문에 **ChainedTransactionManager** 보다는 안정성이 높다.
'Development Story > Java' 카테고리의 다른 글
네이버 클라우드 Ncp Cloud Out Bound Mailer spring구현 (1) | 2024.09.24 |
---|---|
spring boot batch + JtaTransactionManager (0) | 2024.09.02 |
Spring Boot Batch Tibero Database 적용 (0) | 2024.08.30 |
Spring boot 이클립스 디버깅 모드 Transaction 오류 (0) | 2024.08.30 |
Pcap Spring 구현 (2) | 2024.08.29 |