WEBBOOK CHAPTER

Spring Boot 4.1, 시작부터 런칭까지: 28장. 트랜잭션 경계와 프록시 함정을 확인한다

28장. 트랜잭션 경계와 프록시 함정을 확인한다

@Transactional은 annotation 위치가 아니라 proxy를 통과한 호출에 적용된다. 같은 class의 method를 self-call하면 기대한 새 transaction이 열리지 않을 수 있다. private method, checked exception, async thread, event listener가 어느 transaction에 있는지 test로 고정한다. 긴 외부 HTTP 호출을 DB transaction 안에 두지 않는다.

CrewLink의 acknowledgeRisk는 risk 조회·권한·낙관적 version 확인·ack insert·audit/outbox insert를 한 transaction으로 묶는다. commit이 끝난 뒤 알림 worker가 외부 provider를 호출한다. 두 사용자가 같은 risk를 동시에 확인하면 unique business key 또는 version이 한 요청만 신규 변경으로 인정한다. 나머지는 idempotent result 또는 409 계약에 따라 처리한다.

장애 실습은 audit insert 직전 예외, commit 직후 응답 단절, deadlock victim, pool timeout을 주입한다. 첫 경우 모든 업무 row가 rollback되어야 하고, commit-unknown은 같은 idempotency key 재조회로 결과를 찾는다. 단순 @Retryable을 붙이기 전에 transaction 전체를 반복해도 외부 효과가 중복되지 않는지 증명한다.