하나의 트랜잭션 안에서 다른 서비스 메서드를 호출하면, 그 트랜잭션은 같이 묶일까 ? 아니면 새로운 독립 개체일까 ?
이 글은 트랜잭션이 실제로 어떻게 전파되고 작동하는지, 프록시 기반 트랜잭션 구조에서 어떤 영향을 주는지 설명한다.
Propagation .. 현재 트랜잭션이 있을 때, 새로 호출된 메서드가 그 안에 합류할지, 새로 열릴지, 혹은 분리될지 결정하는 정책
먼저 Propagation 의 사전적 의미는 “번식”, “전파” 다.
트랜잭션 전파는 의미 그대로
“하나의 서비스 로직 안에서 다른 트랜잭션 메서드를 호출할 때, 어떤 전파 속성이 설정되어있는지에 따라 트랜잭션의 범위와 롤백 시점 제어”
트랜잭션은 항상 프록시 경계에서만 제어된다. 프록시가 호출될 때, Spring 은 다음 과정을 거친다.
1. 현재 스레드에 트랜잭션이 존재하는가?
↓
2. 있다면, 전파 속성(Propagation)을 읽는다.
↓
3. 속성에 따라 트랜잭션을 합류/보류/분리한다.
↓
4. 비즈니스 메서드 실행 후, 롤백 여부 결정
이때 스프링은 내부적으로 TransactionInterceptor 를 통해 PlatformTransactionManager 의 getTransaction() 메서드를 호출하면서 전파 속성을 반영한다.
| 속성 | 설명 | 동작 방식 |
|---|---|---|
| REQUIRED (기본값) | 기존 트랜잭션 있으면 합류, 없으면 새로 생성 | 가장 일반적인 설정 |
| REQUIRES_NEW | 기존 트랜잭션을 잠시 보류하고 새로운 트랜잭션 생성 | 독립 커밋/롤백 필요할 때 |
| NESTED | 기존 트랜잭션 내에서 부분 롤백 가능한 중첩 트랜잭션 생성 | Savepoint 기반 |
| SUPPORTS | 트랜잭션이 있으면 합류, 없으면 그냥 실행 | 단순 조회 로직 등 |