하나의 트랜잭션 안에서 다른 서비스 메서드를 호출하면, 그 트랜잭션은 같이 묶일까 ? 아니면 새로운 독립 개체일까 ?

이 글은 트랜잭션이 실제로 어떻게 전파되고 작동하는지, 프록시 기반 트랜잭션 구조에서 어떤 영향을 주는지 설명한다.

📌 트랜잭션 전파? Propagation ?

Propagation .. 현재 트랜잭션이 있을 때, 새로 호출된 메서드가 그 안에 합류할지, 새로 열릴지, 혹은 분리될지 결정하는 정책

먼저 Propagation 의 사전적 의미는 “번식”, “전파” 다.

트랜잭션 전파는 의미 그대로

“하나의 서비스 로직 안에서 다른 트랜잭션 메서드를 호출할 때, 어떤 전파 속성이 설정되어있는지에 따라 트랜잭션의 범위와 롤백 시점 제어”

🧩 내부 동작 흐름

트랜잭션은 항상 프록시 경계에서만 제어된다. 프록시가 호출될 때, Spring 은 다음 과정을 거친다.

1. 현재 스레드에 트랜잭션이 존재하는가?
   ↓
2. 있다면, 전파 속성(Propagation)을 읽는다.
   ↓
3. 속성에 따라 트랜잭션을 합류/보류/분리한다.
   ↓
4. 비즈니스 메서드 실행 후, 롤백 여부 결정

이때 스프링은 내부적으로 TransactionInterceptor 를 통해 PlatformTransactionManagergetTransaction() 메서드를 호출하면서 전파 속성을 반영한다.

⭐ 주요 전파 속성 종류 ( Spring 실무 위주 )

속성 설명 동작 방식
REQUIRED (기본값) 기존 트랜잭션 있으면 합류, 없으면 새로 생성 가장 일반적인 설정
REQUIRES_NEW 기존 트랜잭션을 잠시 보류하고 새로운 트랜잭션 생성 독립 커밋/롤백 필요할 때
NESTED 기존 트랜잭션 내에서 부분 롤백 가능한 중첩 트랜잭션 생성 Savepoint 기반
SUPPORTS 트랜잭션이 있으면 합류, 없으면 그냥 실행 단순 조회 로직 등