Post

[매일매일]백엔드 기술 일기: 스프링 트랜잭션 전파 속성, 한 번에 정리하기

안녕하세요! 오늘은 스프링의 트랜잭션 전파 속성(Transaction Propagation) 에 대해 정리해 보았습니다.스프링에서 @Transactional 어노테이션을 사용할 때, 이미 트랜잭션이 진행 중이라면 어떻게 동작할지 결정하는 중요한 속성입니다.단순히 @Transactional만 붙이는 것에서 한 발 더 나아가, 서비스 설계에 맞게 올바르게 설정하는 것이 중요합니다.

🔷 트랜잭션 전파란?스프링에서는 하나의 비즈니스 로직이 여러 메서드로 나눠져 있을 때, 각 메서드마다 트랜잭션을 따로 시작할지, 아니면 기존 트랜잭션에 참여할지를 정할 수 있습니다.예를 들어 A 메서드에서 트랜잭션이 이미 시작된 상태에서 B 메서드를 호출할 때, B 메서드가 어떻게 동작할지 결정하는 것이 바로 전파 속성입니다.@Transactional(propagation = Propagation.XXX) 형태로 설정할 수 있습니다.

✅ 주요 전파 속성1️⃣ REQUIRED (기본값)이미 트랜잭션이 존재하면 해당 트랜잭션을 사용합니다.트랜잭션이 없으면 새로운 트랜잭션을 생성합니다.가장 많이 쓰이는 기본값입니다.

예: “이미 진행 중이면 거기서 같이 처리하고, 없으면 내가 시작할게!”

2️⃣ REQUIRES_NEW항상 새로운 트랜잭션을 생성합니다.기존 트랜잭션이 있다면 잠시 보류(Suspend) 합니다.독립적으로 처리해야 할 작업에 유용하지만, 남용하면 성능/예외 처리에 문제가 될 수 있습니다.

예: “내 건 내가 알아서 할게, 기존 작업은 잠깐 멈춰.”

3️⃣ MANDATORY반드시 트랜잭션이 있어야만 실행됩니다.트랜잭션이 없으면 예외를 발생시킵니다.

예: “트랜잭션 없으면 못해!”

4️⃣ SUPPORTS트랜잭션이 있으면 그 안에서 실행하고, 없으면 트랜잭션 없이 실행합니다.

예: “있으면 쓰고, 없어도 괜찮아.”

5️⃣ NOT_SUPPORTED트랜잭션이 있으면 일시 중단하고, 트랜잭션 없이 실행합니다.트랜잭션이 없는 상태에서만 처리해야 하는 작업에 사용됩니다.

예: “트랜잭션 중에는 못해, 잠깐 멈추고 진행해.”

6️⃣ NESTED이미 트랜잭션이 있으면 Savepoint를 찍고 중첩 트랜잭션을 시작합니다.외부 트랜잭션이 롤백되면 중첩 트랜잭션도 함께 롤백됩니다.

예: “혹시 몰라서 중간 저장해둘게.”

7️⃣ NEVER트랜잭션이 존재하면 예외를 발생시키고, 없으면 트랜잭션 없이 실행합니다.

예: “트랜잭션 있으면 안 돼!”

🚨 주의사항: REQUIRES_NEWREQUIRES_NEW 는 독립적인 트랜잭션이 필요할 때 매우 유용하지만, 남용하면 위험합니다.너무 많이 사용하면 데이터베이스에 부하가 큽니다.트랜잭션 경계가 복잡해지고, 예외 처리가 어려워질 수 있습니다.가능하면 꼭 필요한 상황에서만 사용하는 것을 권장합니다.

📚 더 읽어보기https://www.youtube.com/watch?v=b0s9RzKyHN0

https://www.youtube.com/watch?v=cc4M-GS9DoY

https://mangkyu.tistory.com/269

[Spring] 스프링의 트랜잭션 전파 속성(Transaction propagation) 완벽하게 이해하기 아래의 내용은 김영한님의 디비 접근 기술 2편 강의와 토비의 스프링 등을 바탕으로 정리한 내용입니다.    1. 트랜잭션의 시작과 종료 및 전파 속성(Transaction Propagation)[ 트랜잭션의 시작과 종료 ]트랜잭션은 시작 지점과 끝나는 지점이 존재한다. 시작하는 방법은 1가지이지만 끝나는 방법은 2가지이다. 트랜잭션이 끝나는 방법에는 모든 작업을 확정짓는 커밋(commit)과 모든 작업을 무효화하는 롤백(rollback)이 있다.  트랜잭션의 시작트랜잭션은 하나의 Connection을 가져와 사용하다가 닫는 사이에서… mangkyu.tistory.com

https://stackoverflow.com/questions/37927208/nested-transaction-in-spring-app-with-jpa-postgres​https://hstory0208.tistory.com/entry/REQUIRESNEW%EC%97%90-%EB%8C%80%ED%95%9C-%EC%98%A4%ED%95%B4%EC%99%80-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90

REQUIRES_NEW에 대한 오해와 주의할 점 REQUIRES_NEW에 대한 오해REQUIRES_NEW를 사용하면 물리적으로 트랜잭션이 분리되어 분리한 트랜잭션의 예외가이 트랜잭션을 호출한 상위 트랜잭션에 전파되지 않는다고 이해하고 있었다. 결론부터 말하면 아니였다.어떤식으로 트랜잭션 흐름이 진행되는지 한번 알아보자.@Service@RequiredArgsConstructorpublic class MeetingService { private final MeetingRepository meetingRepository; private final MemberService memberS… hstory0208.tistory.com

✍️ 마무리스프링의 전파 속성은 강력한 도구지만, 잘못 사용하면 서비스에 혼란을 줄 수 있습니다.비즈니스 로직과 트랜잭션 경계를 정확히 정의하고, 필요한 속성을 신중히 선택하는 습관을 가지세요.혹시 더 궁금한 내용이나 사례가 있다면 댓글로 남겨주세요! 🙌​

This post is licensed under CC BY 4.0 by the author.