Spring AOP Pointcut 표현식 - @annotation

목차

@annotation

메서드가 주어진 어노테이션을 가지고 있는 조인 포인트를 매칭

@annotation 은 특정 어노테이션이 적용된 메소드 를 기준으로 Advice 를 적용합니다.

Custom Annotation 생성

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAop {
String value();
}

Advisor 생성

어노테이션을 이용해 Advice 적용하기 위해 @annotation 에 어노테이션 패키지 경로를 지정합니다.

@Slf4j
@Aspect
static class AtAnnotationAspect{
@Around("@annotation(com.example.aop.member.annotation.MethodAop)")
public Object doAtAnnotation(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("[@annotation] {}", joinPoint.getSignature());
return joinPoint.proceed();
}
}

Custom Annotation 적용

@MethodAop 를 메소드에 적용합니다. 해당 어노테이션이 적용된 메소드에 Advice 를 적용합니다.

@ClassAop
@Component
public class MemberServiceImpl implements MemberService {
@Override
@MethodAop("test")
public String hello(String param) {
return null;
}

public String internal(String param){
return "ok";
}
}

MemberService 객체가 프록시 객체로 생성된 것을 확인할 수 있습니다. 또한, @MethodAop 가 적용된 hello 메소드에 Advice 로직이 수행된 것을 확인할 수 있습니다.

@Test
void success(){
log.info("memberService Proxy = {}", memberService.getClass());
memberService.hello("helloA");
}
2021-12-21 00:06:40.720  INFO 35688 --- [    Test worker] c.example.aop.pointcut.AtAnnotationTest  : memberService Proxy = class com.example.aop.member.MemberServiceImpl$$EnhancerBySpringCGLIB$$a8e51818
2021-12-21 00:06:40.727 INFO 35688 --- [ Test worker] .a.p.AtAnnotationTest$AtAnnotationAspect : [@annotation] String com.example.aop.member.MemberServiceImpl.hello(String)
Share