본문 바로가기

Spring

[Spring] 포인트컷(Pointcut) 표현식

포인트컷(Pointcut)과 표현식 & 지시자

 


포인트컷(Pointcut)은 관심 조인 포인트를 결정하므로 어드바이스가 실행되는 시기를 제어할 수 있습니다.

AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공합니다.

@Pointcut("execution(* transfer(..))") // 포인트컷 표현식
private void anyOldTransfer() {} // 포인트컷 서명

포인트컷 표현식은 AspectJ pointcut expression => AspectJ가 제공하는 포인트컷 표현식을 줄여서 표현한 것입니다.

 

포인트컷 지시자


포인트컷 표현식은 excution 같은 포인트컷 지시자(Pointcut Designator, PCD)로 시작합니다.

 

포인트컷 지시자 종류

종류 설명
execution 메서드 실행 조인트 포인트를 매칭
스프링 AOP에서 가장 많이 사용하며, 기능도 복잡
within 특정 타입 내의 조인 포인트를 매칭
args 인자가 주어진 타입의 인스턴스인 조인 포인트
this 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트
target Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트
@target 실행 객체의 클래스에 주어진 타입의 애너테이션이 있는 조인 포인트
@within 주어진 애너테이션이 있는 타입 내 조인 포인트
@annotation 메서드가 주어진 애너테이션을 가지고 있는 조인 포인트를 매칭
@args 전달된 실제 인수의 런타임 타입의 주어진 타입의 애너테이션을 갖는 조인 포인트
bean 스프링 전용 포인트컷 지시자이고 빈의 이름으로 포인트컷을 지정

 

 

Pointcut 표현식 결합


포인트컷 표현식은 &&, ||, ! 를 사용하여 결합할 수 있습니다.

이름으로 pointcut 표현식을 참조할 수도 있습니다.

@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {} // (1)

@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {} // (2)

@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} // (3)
  1. anyPublicOperation은 메서드 실행 조인 포인트가 공용 메서드의 실행을 나타내는 경우 일치합니다.
  2. in Trading 메서드 실행이 거래 모듈에 있는 경우에 일치합니다.
  3. tradingOperation은 메서드 실행이 거래 모듈의 공개 메서드를 나타내는 경우 일치합니다.

일반적인 pointcut 표현식들

  • 모든 공개 메서드 실행
    • execution(public * * (..))
  • set 다음 이름으로 시작하는 모든 메서드 실행
    • execution(* set*(..))
  • AccountService 인터페이스에 의해 정의된 모든 메서드 실행
    • execution(* com.xyz.service.AccountService.*(..))
  • service 패키지에 정의된 메서드 실행
    • execution(* com.xyz.service.*.*(..))
  • 서비스 패키지 또는 해당 하위 패키지 중 하나에 정의된 메서드 실행
    • execution(* com.xyz.service..*.*(..))
  • 서비스 패키지 내의 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • within(com.xyz.service.*)

  • 서비스 패키지 또는 하위 패키지 중 하나 내의 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • within(com.xyz.service..*)

  • AccountService 프록시가 인터페이스를 구현하는 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • this(com.xyz.service.AccountService)

  • AccountService 대상 객체가 인터페이스를 구현하는 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • target(com.xyz.service.AccountService)

  • 단일 매개변수를 사용하고 런타임에 전달된 인수가 Serializable과 같은 모든 조인 포인트 (Spring AOP에서만 메소드 실행)
    • args(java.io.Serializable)

  • 대상 객체에 @Transactional 애너테이션이 있는 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • @target(org.springframework.transaction.annotation.Transactional)

  • 실행 메서드에 @Transactional 애너테이션이 있는 조인 포인트 (Spring AOP에서만 메서드 실행)
    • @annotation(org.springframework.transaction.annotation.Transactional)

  • 단일 매개 변수를 사용하고 전달된 인수의 런타임 유형이 @Classified 애너테이션을 갖는 조인 포인트(Spring AOP에서만 메서드 실행)
    • @args(com.xyz.security.Classified)

  • tradeService 라는 이름을 가진 스프링 빈의 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • bean(tradeService)

  • 와일드 표현식 *Service 라는 이름을 가진 스프링 빈의 모든 조인 포인트
    • bean(*Service)