Loading...
Spring Framework Reference Documentation 7.0.2의 Understanding the Spring Framework’s Declarative Transaction Implementation의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
클래스에 @Transactional 어노테이션을 추가하고, 설정에 @EnableTransactionManagement를
추가하라고 말하는 것만으로는, 그것이 어떻게 동작하는지 이해하기에 충분하지 않습니다.
더 깊이 있는 이해를 제공하기 위해, 이 섹션에서는 트랜잭션 관련 이슈의 문맥에서
Spring Framework의 선언적 트랜잭션 인프라스트럭처의 내부 동작 방식을 설명합니다.
Spring Framework의 선언적 트랜잭션 지원과 관련하여 파악해야 할 가장 중요한 개념은, 이 지원이 AOP 프록시를 통해 활성화된다는 점과 트랜잭션 어드바이스가 메타데이터(현재 XML 기반 또는 어노테이션 기반)에 의해 구동된다는 점입니다.
AOP와 트랜잭션 메타데이터의 조합은, 적절한 TransactionManager
구현과 함께 TransactionInterceptor를 사용하는 AOP 프록시를 생성하여
메서드 호출 주변의 트랜잭션을 구동합니다.
Spring AOP는 AOP 섹션에서 다룹니다.
Spring Framework의 TransactionInterceptor는 명령형 및 리액티브 프로그래밍 모델에
대한 트랜잭션 관리를 제공합니다.
인터셉터는 메서드 반환 타입을 검사하여
원하는 트랜잭션 관리 플레이버를 감지합니다.
Publisher 또는 Kotlin Flow(또는
그 하위 타입)와 같은 리액티브 타입을 반환하는 메서드는 리액티브 트랜잭션
관리의 대상이 됩니다.
void를 포함한 그 밖의 모든 반환 타입은 명령형
트랜잭션 관리를 위한 코드 경로를 사용합니다.
트랜잭션 관리 플레이버는 어떤 트랜잭션 매니저가 필요한지에 영향을 줍니다.
명령형 트랜잭션은 PlatformTransactionManager를 필요로 하는 반면, 리액티브
트랜잭션은 ReactiveTransactionManager 구현을 사용합니다.
@Transactional은 일반적으로PlatformTransactionManager에 의해 관리되는 스레드 바인딩 트랜잭션과 함께 동작하며, 현재 실행 스레드 내의 모든 데이터 액세스 오퍼레이션에 트랜잭션을 노출합니다. 참고: 이는 메서드 내에서 새로 시작된 스레드에는 전파되지 않습니다.ReactiveTransactionManager에 의해 관리되는 리액티브 트랜잭션은 스레드 로컬 속성 대신 Reactor 컨텍스트를 사용합니다. 그 결과, 참여하는 모든 데이터 액세스 오퍼레이션은 동일한 리액티브 파이프라인 내의 동일한 Reactor 컨텍스트에서 실행되어야 합니다.ReactiveTransactionManager로 설정된 경우, 모든 트랜잭션 경계가 지정된 메서드는 리액티브 파이프라인을 반환해야 합니다. Void 메서드나 일반적인 반환 타입은 예를 들어 해당@Transactional선언의transactionManager속성을 통해 일반PlatformTransactionManager와 연관되어야 합니다.
다음 이미지는 트랜잭션 프록시에서 메서드를 호출하는 것에 대한 개념적 뷰를 나타냅니다:

Declarative Transaction Management
Example of Declarative Transaction Implementation