0. 들어가며
개발할 때 자주 사용하는 @Transactional에 대해 막연히 알고있었던 것 같아 글로 정리해봅니다.
1. 기본 메커니즘
@Transactional은 무엇을 해주나?
를 간단히 살펴보면 아래과 같다.
<aside>
💡
- 스프링이 프록시를 만들어 메서드 호출을 가로채고
- PlatformTransactionalManager를 이용해 트랜잭션을 시작, 커밋, 롤백한다.
- 커넥션은 ThreadLocal을 통해 현재 스레드에 묶인다.
</aside>
좀 더 자세히 알아보자
1. 프록시 생성
- 스프링 컨테이너는 @Transactional이 붙은 빈을 프록시로 감싼다.
- 환경에 따라 JDK 동적 프록시(인터페이스 기반) 또는 CGLIB(클래스 상속 기반)을 사용한다.
2. 호출 가로채기
- 외부에서 메서드를 호출하면 프록시가 호출된다.
- TransactionInterceptor가 @Transactional 메타데이터 (전파, 격리, timeout, readOnly, rollback 규칙)을 해석한다.
3. 트랜잭션 시작 & 리소스 바인딩
- PlatformTransactionManager.getTransaction(…) 호출