Spring 핵심원리 고급편 - Advisor

목차

참고

본 포스트는 김영한의 스프링 핵심 원리 - 고급편 내용을 참고해 만들었습니다.

Advisor

Advisor는 Spring AOP에서 Advice, Pointcut, Advisor의 개념을 쉽게 사용할 수 있도록 제공합니다.

Advice 는 메소드를 실행하기 전, 후, 혹은 예외가 발생했을 때 실행되는 부가 기능을 말하며, Pointcut 은 Advice가 적용될 메소드를 선택하는 기준입니다. Advisor 는 Advice 와 Pointcut 을 결합한 것으로, 어떤 메소드에 어떤 Advice 를 적용할지를 결정합니다.

  • PointCut (포인트 컷)
    • 어디에 부가 기능을 적용할지 적용하지 않을지 판단하는 필터링 로직
    • 클래스 이름과 메서드 이름을 이용해 필터링 한다.
  • Advice (어드바이스)
    • 프록시가 호출하는 부가 기능
  • Advisor (어드바이저)
    • 단순하게 하나의 포인트 컷하나의 어드바이스 를 갖고 있는 것

DefaultPointcutAdvisor

DefaultPointcutAdvisor 은 Advisor 의 기본 구현체입니다. 부가 기능을 어디에 적용할지 Pointcut 과 부가 기능 Advice 를 인자로 Advisor 객체를 생성하고 ProxyFactory 객체 addAdvisor 메소드들 이용해 Advisor 를 적용한다.

public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable {
private Pointcut pointcut = Pointcut.TRUE;

public DefaultPointcutAdvisor() {
}

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

public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) {
this.pointcut = pointcut;
setAdvice(advice);
}

public void setPointcut(@Nullable Pointcut pointcut) {
this.pointcut = (pointcut != null ? pointcut : Pointcut.TRUE);
}

@Override
public Pointcut getPointcut() {
return this.pointcut;
}


@Override
public String toString() {
return getClass().getName() + ": pointcut [" + getPointcut() + "]; advice [" + getAdvice() + "]";
}
}

Advisor 생성 및 적용

ServiceInterface target = new ServiceImpl();
ProxyFactory proxyFactory = new ProxyFactory(target);

// Advisor 인터페이스의 가장 일반적인 구현체
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice());
// Proxy Factory 에 적용할 Advisor 를 지정한다.
proxyFactory.addAdvisor(advisor);
ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();

proxy.save();
proxy.find();
22:40:35.135 [Test worker] INFO hello.proxy.common.advice.TimeAdvice - TimeProxy 실행
22:40:35.138 [Test worker] INFO hello.proxy.common.service.ServiceImpl - save 호출
22:40:35.138 [Test worker] INFO hello.proxy.common.advice.TimeAdvice - TimeProxy 종료 resultTime = 0
22:40:35.139 [Test worker] INFO hello.proxy.common.advice.TimeAdvice - TimeProxy 실행
22:40:35.140 [Test worker] INFO hello.proxy.common.service.ServiceImpl - find 호출
22:40:35.140 [Test worker] INFO hello.proxy.common.advice.TimeAdvice - TimeProxy 종료 resultTime = 0
Share