@Transactional 심화 — 전파, 격리, self-invocation, rollback-only
정산·이체 업무에서 자주 틀리는 트랜잭션 함정을 직접 만든 미니 트랜잭션 매니저로 재현하고, Spring Boot + MyBatis + Oracle 조합의 실무 규칙을 정리합니다.
1. 왜 배우는가
@Transactional 은 메서드 하나만 붙이면 되는 것처럼 보이지만, 실무에서 사고가 나는 지점은 대부분 이 어노테이션의 동작 방식을 오해한 곳입니다. 이체 금액이 두 번 빠지거나, 실패 로그가 남아야 하는데 같이 롤백되거나, 분명 예외를 잡았는데 커밋 시점에 갑자기 UnexpectedRollbackException 이 터지는 사고가 대표적입니다.
이런 문제는 대부분 전파 속성, 롤백 규칙, self-invocation 세 가지 중 하나를 몰라서 생깁니다. 코드 리뷰에서 "이 메서드는 REQUIRES_NEW 여야 하지 않나요"라는 지적을 받아도 왜 그런지 설명하지 못하면 다음에 또 같은 실수를 반복합니다.
이 레슨은 Spring 없이 JDK 동적 프록시로 트랜잭션 매니저를 직접 만들어, @Transactional 이 실제로 무엇을 하는지 코드 레벨에서 확인합니다. 코드는 java-src/extension/15_transaction 에 있고 Main·Tx·AccountService 세 파일로 구성됩니다.