← 질문 목록
#46깊이 0
스프링 AOP의 프록시 자기 호출 시 무엇이 문제인가?
대상 객체가 자기 메서드를 부르면 프록시를 거치지 않는다. 이 호출에는 AOP 부가 기능이 동작하지 않는다.
- 1. 외부 호출에서 프록시로: AOP 부가 기능 적용
- 2. 프록시에서 대상 객체로: 실제 로직 호출
- 3. 대상 객체에서 대상 객체로: **자기 호출**. this로 내부 메서드를 직접 불러 AOP 누락
스프링은 기본적으로 CGLIB이나 JDK Dynamic Proxy를 사용해 대상 객체를 감싸는 프록시를 만든다. 외부에서 호출할 때만 이 프록시로 진입하며, 클래스 내부에서 다른 메서드 호출 시에는 this로 직접 호출한다.
이로 인해 @Transactional이나 @Cacheable이 붙은 내부 메서드를 this로 호출하면 프록시의 가로채기(intercept)를 건너뛰어, 그 호출에는 트랜잭션 전파나 캐시 부가기능이 적용되지 않는다.
해결책은 로직을 별도 서비스로 빼서 프록시를 거치게 하는 것이다. 자기 자신을 다시 주입하는 방식도 있지만 결합도가 높아진다.