트랜잭션은 AOP 기반, 프록시 기반 들어는 봤는데 무슨 관계가 있는건지는 잘 모르겠는데 ?
이 글은 트랜잭션과 프록시가 무슨 관계이며 내부에서 어떤 동작을 하는지 설명한다.
Spring 에서 @Transactional 은 단순히 DB 커밋을 자동으로 관리해주는 어노테이션이 아니다.
이 어노테이션이 동작하려면 반드시 프록시(proxy) 가 개입한다.
@Transactional이 ㅂ메서드의 실행을 프록시가 가로채서 트랜잭션을 열고 닫는 구조
⇒ 즉, 트랜잭션은 프록시가 없으면 존재하지 않는다.
Spring 은 @Transactional 이 붙은 빈을 초기화 할 때 원본 객체(target) 을 감싸는 프록시 객체(proxy) 를 만든다.
이 프록시가 메서드 호출 전후로 다음과 같은 로직을 수행한다:
PlatformTransactionManger.begin())@Service
public class OrderService {
@Transactional
public void placeOrder() {
saveOrder();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveOrder() {
// DB save
}
}
위 코드를 기준으로 우린 이렇게 기대할 것이다.
“saveOrder() 는 REQUIRES_NEW 니까 별도 트랜잭션이 시작되겠군”
하지만 실제로는 그렇지 않다. placeOrder() 에 의해 호출된 saveOrder() 는 프록시를 통하지 않았기 때문.