Search

private method가 Transactional 을 타지 않는 이유

Transactional 어노테이션으로 인해 프록시 객체(보통 서비스)가 생성된다.
ParentA(서비스), ChildB(프록시) 가 있을 때 ChildB 에서 ParentA 를 super로 부르면 ParentA 에서 this 메서드는 ChildB 의 메서드를 호출한다.
JPA 에서는 그래서 CbildB 에서 ParentA 의 메서드를 호출할 때 super 로 호출하지 않고 필드에 초기화한 ParentA 로 호출한다.
그래서 서비스에서 내부 퍼블릭 메서드 a, b 가 있고 a 가 b 를 호출할 때, b에 Transactional 이 걸려있다고 하더라도 통하지 않는다. 왜냐하면 a 가 b 를 호출할 때 transaction이 감싸진 프록시의 b 를 호출하지 않고 바로 자신(서비스) 의 b 를 호출하기 때문이다.

요약

상속이 아닌 조합을 이용하기 때문이다!
JDK Dynamic Proxy은 상속, CGLIB 은 조합