Spring 트랜잭션 전파 속성의 동작 원리
한 줄 답변
트랜잭션 전파는 진행 중인 트랜잭션이 있을 때 새로운 트랜잭션 경계가 어떻게 반응할지를 정의하는 설정입니다. 기본값인 REQUIRED는 부모 트랜잭션에 참여하고, REQUIRES_NEW는 별도의 독립적인 트랜잭션을 생성하여 각각의 커밋/롤백 범위를 격리합니다.
핵심 개념 정리
Spring의 트랜잭션 전파(Propagation)는 Transactional 어노테이션의 핵심 설정으로, 논리적 트랜잭션과 물리적 트랜잭션의 관계를 관리합니다. 자바의 ThreadLocal을 기반으로 작동하는 TransactionSynchronizationManager를 통해 현재 쓰레드에 할당된 데이터베이스 커넥션을 공유하거나 새로 생성하는 방식을 제어합니다.
가장 많이 사용되는 REQUIRED는 부모 트랜잭션이 존재하면 해당 트랜잭션에 참여하고, 존재하지 않으면 새로 생성합니다. 이때 모든 참여하는 논리 트랜잭션은 단 하나의 물리 트랜잭션으로 묶이기 때문에, 어느 한 곳에서라도 예외가 발생하여 롤백 마크(rollback-only)가 찍히면 부모에서 예외를 잡더라도 전체 트랜잭션이 롤백됩니다.
반면 REQUIRES_NEW는 부모 트랜잭션의 유무와 관계없이 항상 새로운 물리 트랜잭션을 생성합니다. 이 방식은 부모 트랜잭션의 롤백이 자식 트랜잭션에 영향을 주지 않아야 하거나, 반대로 자식의 실패가 부모에게 전이되지 않아야 하는 독립적인 로깅이나 알림 처리 로직에 주로 활용됩니다. 다만, 물리 트랜잭션이 늘어나는 만큼 DB 커넥션 점유 시간이 길어지고 커넥션 풀 부족 현상을 야기할 수 있어 사용에 주의가 필요합니다.
비교 정리
| 항목 | REQUIRED (기본값) | REQUIRES_NEW |
|---|---|---|
| 동작 방식 | 기존 트랜잭션이 있으면 참여, 없으면 신규 생성 | 기존 트랜잭션 보류 후 항상 신규 생성 |
| 롤백 전파 | 자식 롤백 시 부모까지 전체 롤백됨 | 각 트랜잭션이 독립적으로 롤백/커밋 |
| 물리 커넥션 | 동일한 DB 커넥션 공유 사용 | 별도의 DB 커넥션 점유 (커넥션 부족 주의) |
| 주요 용도 | 일반적인 비즈니스 로직의 원자성 보장 | 로그 기록, 알림 발송 등 독립적 작업 |
면접에서 이렇게 답하세요
단순히 속성을 나열하기보다는 '논리 트랜잭션'과 '물리 트랜잭션'의 개념을 들어 설명하는 것이 좋습니다. 특히 자식 트랜잭션에서 예외가 발생했을 때 부모에서 try-catch로 예외를 잡더라도 UnexpectedRollbackException이 발생하는 케이스를 언급하며, Spring의 롤백 마킹 메커니즘과 프록시 기반 AOP의 한계를 정확히 이해하고 있음을 보여주면 시니어급 답변으로 인정받을 수 있습니다.
자주 묻는 추가 질문
Q. NESTED 전파 속성은 REQUIRES_NEW와 무엇이 다른가요?
NESTED는 이미 진행 중인 트랜잭션 안에 세이브포인트를 설정합니다. 부모 트랜잭션의 롤백은 자식에게 영향을 주지만, 자식의 롤백은 부모에게 영향을 주지 않고 세이브포인트까지만 복구됩니다.
Q. 동일 클래스 내에서 @Transactional 메서드를 호출할 때 전파가 안 되는 이유는?
Spring AOP는 프록시 기반으로 동작하기 때문입니다. 클래스 내부 호출(Self-invocation)은 프록시를 거치지 않고 직접 메서드를 호출하므로 트랜잭션 인터셉터가 가로채지 못해 전파 설정이 무시됩니다.
Q. SUPPORTS와 NOT_SUPPORTED의 차이점은 무엇인가요?
SUPPORTS는 트랜잭션이 있으면 참여하고 없으면 비트랜잭션으로 실행합니다. NOT_SUPPORTED는 트랜잭션이 있으면 일단 보류하고 반드시 비트랜잭션 상태로 로직을 실행합니다.
커뮤니티 하이라이트
“주니어 시절 REQUIRES_NEW 남용하다가 커넥션 풀 부족으로 장애 냈던 기억이 나네요. 전파 속성은 항상 DB 리소스 사용량을 고려해야 합니다.”
“UnexpectedRollbackException 해결법 물어보는 면접관 많습니다. 롤백 마크가 찍힌 논리 트랜잭션을 부모가 강제로 커밋하려고 할 때 발생한다는 점을 꼭 기억하세요.”
42명의 개발자가 이 질문에 참여했습니다
관련 면접 질문
앱에서 직접 답변해보세요
매일 3개의 면접 질문에 답변하고,
다른 개발자들의 답변을 비교해보세요.