오봉이와 함께하는 개발 블로그

스프링 핵심 원리 - 고급편 > 어드바이저 본문

BE/Spring

스프링 핵심 원리 - 고급편 > 어드바이저

오봉봉이 2024. 10. 1. 22:48
728x90

스프링 핵심 원리 - 고급편 > 어드바이저

이전 글에서 봤듯, 어드바이저는 하나의 포인트컷과 어드바이스를 가지고 있다.
프록시 팩토리를 통해 프록시 생성 시 어드바이저를 제공하면 어디에 어떤 기능을 제공할 지 알 수 있다.

public class AdvisorTest {

  @Test
  void advisorTest1() {
    ServiceImpl target = new ServiceImpl();
    ProxyFactory proxyFactory = new ProxyFactory(target);
    DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice());
    proxyFactory.addAdvisor(advisor);
    ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();

    proxy.save();
    proxy.find();
  }

}
  • new DefaultPointcutAdvisor
    • Advisor 인터페이스의 가장 일반적인 구현체
    • 생성자를 통해 하나의 포인트컷과 하나의 어드바이스를 넣어서 생성
  • Pointcut.TRUE
    • 항상 true를 반환하는 포인트컷
    • 추후 직접 구현하기 전 사용하는 임시 포인트컷으로 사용
  • new TimeProxy()
    • 앞서 개발한 TimeAdvice를 제공
  • ProxyFactory.addAdvisor(advisor)
    • 프록시 팩토리에 적용할 어드바이저를 지정
    • 어드바이저는 내부에 포인트컷과 어드바이스 모두 가지고 있다.
    • 따라서 어디에 어떤 부가 기능을 적용해야 할지 어드바이저 하나로 알 수 있다.
    • 프록시 팩토리 사용 시 어드바이저는 필수

그런데 생각해보면 이전에 분명히 proxyFactory.addAdvice(new TimeAdvice()) 이렇게 어드바이저가 아니라 어드바이스를 바로 적용했다.
이것은 단순히 편의 메서드이고 결과적으로 해당 메서드 내부에서 지금 코드와 똑같은 다음 어드바이저가 생성된다. DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice())

  public void addAdvice(int pos, Advice advice) throws AopConfigException {
    Assert.notNull(advice, "Advice must not be null");
    if (advice instanceof IntroductionInfo) {
      this.addAdvisor(pos, new DefaultIntroductionAdvisor(advice, (IntroductionInfo)advice));
    } else {
      if (advice instanceof DynamicIntroductionAdvice) {
        throw new AopConfigException("DynamicIntroductionAdvice may only be added as part of IntroductionAdvisor");
      }

      this.addAdvisor(pos, new DefaultPointcutAdvisor(advice));
    }

  }

  public DefaultPointcutAdvisor(Advice advice) {
    this(Pointcut.TRUE, advice);
  }

this.addAdvisor(pos, new DefaultPointcutAdvisor(advice));를 통해 실제로 확인할 수 있다.
(참고로 AdvisedSupport.class 파일을 디컴파일 해서 line 285를 보면 확인 가능하다.)

image

프록시 팩토리는 어드바이저를 알고, 어드바이저는 포인트컷과 어드바이스를 알고 있는 현태의 관계를 그릴 수 있다.

 

출처: 김영한 지식공유자의 스프링 핵심 원리 고급편

728x90
Comments