Spring Data JPA를 사용하면서 @Transactional
어노테이션 하나로 트랜잭션 관리가 마법처럼 작동하는 것을 경험해보셨을 것입니다. 이 글에서는 이러한 "마법" 뒤에 숨겨진 Spring의 트랜잭션 관리 메커니즘을 살펴보겠습니다.

Spring Data JPA 트랜잭션의 주요 구성 요소
Spring Data JPA의 트랜잭션 관리 아키텍처는 여러 핵심 컴포넌트로 구성되어 있으며, 이들이 유기적으로 협력하여 트랜잭션을 처리합니다.
1. 클라이언트 컴포넌트(Client Component)
애플리케이션의 시작점으로, 비즈니스 로직을 수행하기 위해 서비스 메서드를 호출합니다. 이때 중요한 점은 클라이언트가 실제 서비스 구현체가 아닌 프록시 객체를 호출한다는 것입니다.
2. 스프링 컨테이너(Spring Container)와 빈(Beans)
스프링 컨테이너는 애플리케이션의 핵심 객체들을 빈으로 관리합니다. 특히 트랜잭션 관리에서는:
- 의존성 주입(DI)을 통해 컴포넌트 간 연결을 제공합니다
- 트랜잭션 처리를 위한 프록시 객체를 생성합니다
- 서비스 메서드 호출 시 트랜잭션 처리 로직이 자동으로 적용되도록 합니다
3. 프록시(Proxy)와 Method Invocation
Spring AOP의 핵심 구현 메커니즘으로, 다음과 같은 역할을 수행합니다:
- 클라이언트의 서비스 호출을 가로챕니다
- Method Invocation 객체를 생성하여 원본 메서드 호출 정보를 캡슐화합니다
- 트랜잭션 인터셉터로 제어를 위임합니다
4. 트랜잭션 인터셉터(Transaction Interceptor)
AOP의 Advice 역할을 하며, 메서드 호출을 가로채고 트랜잭션 경계를 설정합니다:
- invoke() 메서드를 통해 Method Invocation 객체를 수신합니다
- Platform Transaction Manager(PTM)를 사용하여 getTransaction() 메서드를 호출합니다