“별도 클래스”로 분리
Spring에서 REQUIRES_NEW는 말 그대로 **“기존 트랜잭션을 잠시 중단하고, 완전히 새로운 트랜잭션을 시작”**하는 옵션이다.
Chunk Commit, 배치 처리, 부분 커밋, 실패해도 일부만 저장해야 하는 로직에서 거의 필수로 쓰인다.
그런데 이 옵션은 아무 데나 붙인다고 동작하지 않는다.
특히 같은 클래스 안에서 호출하면 안 먹힌다.
1. Spring 트랜잭션은 “프록시”로 동작한다
Spring의 @Transactional은 AOP 프록시 기반이다.
즉, 실제 구조는 이렇다.
Client → Transaction Proxy → Service Bean → method()
@Transactional이 붙은 메서드는
프록시 객체를 통해 호출될 때만 트랜잭션이 열린다.
2. 같은 클래스에서 호출하면 프록시를 안 탄다 (Self-Invocation)
이게 왜 치명적이냐
- 실제로는 하나의 트랜잭션
- 수만 건 커밋이 안 나뉨
- Undo, Redo, Lock, Rollback 전부 누적
- 장애 나면 전부 롤백
즉,
“나는 Chunk Commit 했다고 믿었는데
DB는 풀 트랜잭션으로 처리하고 있었다”
이게 제일 위험한 상황이다.
'Backend' 카테고리의 다른 글
| Spring Boot 버전 비교 4.0.0 vs 3.2.x vs 2.7.x (0) | 2026.02.01 |
|---|---|
| SqlSessionTemplate란? (1) | 2026.01.19 |
| @Transactional(propagation = REQUIRES_NEW) (0) | 2026.01.04 |
| Chunk Commit (0) | 2025.12.28 |
| JVM GC (0) | 2025.12.21 |