포인트 컷(Pointcut)
포인트컷 표현식(AspectJ pointcut expression)
// {} 안에 구성들이 바뀌는 부분
@{Advice}("{pointcut-designator}({parameter})")
// 예시
@Around("execution(public * start.aop.controller..*(..))")
포인트컷 지시자
종류 | 설명 |
---|---|
execution | 메서드 실행 조인트 포인트를 매칭 스프링 AOP에서 가장 많이 사용하며, 기능도 복잡 |
within | 특정 타입 내의 조인 포인트를 매칭 |
args | 인자가 주어진 타입의 인스턴스인 조인 포인트 |
this | 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 |
target | Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트 |
@target | 실행 객체의 클래스에 주어진 타입의 애너테이션이 있는 조인 포인트 |
@within | 주어진 애너테이션이 있는 타입 내 조인 포인트 |
@annotation | 메서드가 주어니 애너테이션을 가지고 있는 조인 포인트를 매칭 |
@args | 전달된 실제 인수의 런타임 타입이 주어진 타입의 애너테이션을 갖는 조인 포인트 |
bean | 스프링 전용 포인트컷 지시자이고 빈의 이름으로 포인트컷을 지정한다. |
execution
// {} 값이 변경 가능한 값임
// ? 는 보통 생략해서 사용
@{kind-of-Advice}("execution({modifiers-pattern}? {return-type-pattern} {declaring-type-pattern}? {method-name-pattern}({param-pattern}) {throws-pattern}?)")
// 예시
@Around("execution(public * start.aop.controller..*(..))")
기타 (Spring AOP 에서만 실행가능)
표현식 결합 및 재사용
@Component
@Aspect
public class Aspect {
@Pointcut("execution(* start.aop.service.controller.*.*(..))")
private void forAllController() {}
@Pointcut("execution(String start.aop.service.controller.*.*())")
private void forAllViewController() {}
// 메서드 이름을 가져와서 해당 조건으로 사용 가능
@Around("forAllContorller() && !forAllViewController")
public void saveRestApiLog() {
...
}
// 메서드를 그대로 가져오는 것도 가능
@Around("forAllContorller()")
public void saveAllApiLog() {
...
}
}