Spring

[Spring] 스프링 AOP(4) - @Pointcut 어노테이션

재담 2022. 2. 19. 22:56

@Pointcut 어노테이션을 이용한 Pointcut 설정

XML 설정에서 pointcut-ref 속성을 이용해서 Pointcut을 설정하고 여러 Advice에서 동일한 Pointcut을 참조할 수 있었다. @Aspect 어노테이션을 사용하는 경우에도 @Pointcut 어노테이션을 이용해서 Pointcut 설정을 재사용할 수 있다.

@Aspect
public class Profile {

    @Pointcut("execution(public * com.mypackage..*(..))")
    private void profileTarget() {}

    @Around("profileTarget()")
    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
        // 이하 생략
        ...
    }
}

@Pointcut 어노테이션이 적용된 메서드는 리턴 타입이 void이어야만 한다. 그리고 일반적으로 @Pointcut 어노테이션이 적용된 메서드는 메서드 몸체에 코드를 갖지 않는다. 왜냐하면 코드를 가져도 의미가 없기 때문이다.

 

@Pointcut 메서드의 이름을 이용해서 Pointcut을 참조할 수 있다. 이때 메서드 이름은 다음과 같이 범위에 따라서 알맞게 입력해야 한다.

  • 같은 클래스에 위치한 @Pointcut 메서드는 "메서드이름"만 입력
  • 같은 패키지에 위치한 @Pointcut 메서드는 "클래스단순이름.메서드이름"을 입력
  • 다른 패키지에 위치한 @Pointcut 메서드는 "완전한클래스이름.메서드이름"을 입력
@Aspect
public class LogginAspect {
    // 클래스의 단순한 이름을 사용
    @Before("PublicPointcut.publicMethod()")
    public void before() {
        // 메서드 실행 전 전처리 수행
        ...
    }
    
    // 클래스의 완전한 이름을 사용
    @AfterReturning(
        pointcut="com.mypackage.aop.PublicPointcut.publicMethod()",
        returning="ret")
    public void afterReturning(Object ret) {
        // 메서드 실행 후 후처리 수행
        // 메서드의 리턴값이 ret
        ...
    }
}

위 코드는 클래스의 단순한 이름과 완전한 클래스 이름을 사용하는 경우를 보여주고 있다.

 

@Pointcut 메서드를 사용할 때 주의할 점은 메서드 접근 제어가 그대로 적용된다는 점이다. 예를 들어 private으로 선언된 @Pointcut 메서드는 다른 클래스에서 사용할 경우 익셉션이 발생하게 된다.

 

또한 @Pointcut 메서드는 @Aspect 기반의 Aspect 구현뿐만 아니라 XML 스키마의 pointcut 속성 값으로도 사용할 수 있다.

<aop:after method="afterFinally"
    pointcut="com.mypackage.aop.PublicPointcut.publicMethod()"/>

Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)