트랜잭션은 AOP 기반, 프록시 기반 들어는 봤는데 무슨 관계가 있는건지는 잘 모르겠는데 ?

이 글은 트랜잭션과 프록시가 무슨 관계이며 내부에서 어떤 동작을 하는지 설명한다.

📌 트랜잭션과 프록시의 관계

Spring 에서 @Transactional 은 단순히 DB 커밋을 자동으로 관리해주는 어노테이션이 아니다. 이 어노테이션이 동작하려면 반드시 프록시(proxy) 가 개입한다.

@Transactional 이 ㅂ메서드의 실행을 프록시가 가로채서 트랜잭션을 열고 닫는 구조

⇒ 즉, 트랜잭션은 프록시가 없으면 존재하지 않는다.

🧩 프록시가 실제로 하는 일

Spring 은 @Transactional 이 붙은 빈을 초기화 할 때 원본 객체(target) 을 감싸는 프록시 객체(proxy) 를 만든다.

이 프록시가 메서드 호출 전후로 다음과 같은 로직을 수행한다:

  1. 현재 스레드에서 활성 트랜잭션이 있는지 Check
  2. 없으면 새 트랜잭션 생성(PlatformTransactionManger.begin())
  3. 실제 비즈니스 메서드 실행(Target)
  4. 예외 발생 ⇒ rollback, 정상 종료 ⇒ commit
  5. 트랜잭션 종료

🧪 이렇게 코드를 작성하면 ..

@Service
public class OrderService {

    @Transactional
    public void placeOrder() {
        saveOrder();
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveOrder() {
        // DB save
    }
}

위 코드를 기준으로 우린 이렇게 기대할 것이다.

“saveOrder() 는 REQUIRES_NEW 니까 별도 트랜잭션이 시작되겠군”

하지만 실제로는 그렇지 않다. placeOrder() 에 의해 호출된 saveOrder()프록시를 통하지 않았기 때문.