AOP 프록시와 내부 호출 문제

박찬우·2024년 2월 17일
0

스프링

목록 보기
76/88

AOP 프록시와 내부 호출 문제

  • AOP를 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다
  • 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다

예)

  • 서비스
@Slf4j
@Component
public class CallServiceV0 {

    public void external() {
        log.info("call external");
        internal();
    }

    public void internal() {
        log.info("call internal");
    }

}
  • AOP
@Slf4j
@Aspect
public class CallLogAspect {
    @Before("execution(* hello.aop.internalcall..*.*(..))")
    public void doLog(JoinPoint joinPoint) {
        log.info("aop={}", joinPoint.getSignature());
    }
}
  • TEST
@Slf4j
@SpringBootTest
@Import(CallLogAspect.class)
class CallServiceV0Test {
    @Autowired
    CallServiceV0 callServiceV0;

    @Test
    void external() {
        callServiceV0.external();
    }

    @Test
    void internal() {
        callServiceV0.internal();
    }
}

  • 결과

    • external()
      • 문제는 callServiceV0.external() 안에서 internal() 을 호출할 때 발생한다. 이때는 CallLogAspect 어드바이스가 호출되지 않는다
      • 자기 자신의 내부 메서드를 호출하는 this.internal() 이 되는데, 여기서 this 는 실제 대상 객체(target)의 인스턴스를 뜻한다
      • 즉, 프록시를 거치지 않는다
    • internal()
      • 프록시를 거치므로 정상 작동
profile
진짜 개발자가 되어보자

0개의 댓글