서버

spring transaction self invocation 문제

_soboro 2025. 9. 9. 16:39

Bean을 통한 호출이 아닌 경우에는 Proxy가 self invocation된 메소드를 인터셉트하지 못하기 때문에 @Transactional이 적용되지 않는다.

Spring은 Bean의 메소드를 CGLIB Proxy로 감싸 트랜잭션을 처리하는데, self-invocation으로 호출된 메소드는 Proxy를 거치지 않으므로 트랜잭션 처리가 불가능하다. 따라서 this.method() 형태로 메소드를 호출하면, 해당 메소드에 선언된 트랜잭션은 동작하지 않는다.

 

해결 법은 transaction을 self invocation 처리된 메소드에 달지 않고 감싸진 메소드에 넣는다. 필요하다면, self invocation 된 메소드를 다른 클래스로 따로 추출한다.