[Spring] Pointcut 표현식

SEB_BE_43_yeori316·2023년 2월 8일
0

Spring

목록 보기
17/22

Pointcut 표현식

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

  • 포인트컷은 관심 조인 포인트를 결정하므로 어드바이스가 실행되는 시기를 제어할 수 있습니다.
  • AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공합니다.
@Pointcut("execution(* transfer(..))") // 포인트컷 표현식
private void anyOldTransfer() {} // 포인트컷 서명
  • 포인트컷 표현식은 AspectJ pointcut expression ⇒ AspectJ가 제공하는 포인트컷 표현식을 줄여서 표현하는 것입니다.

포인트컷 지시자

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

포인트컷 지시자 종류

execution을 가장 많이 사용하고 나머지는 자주 사용하지 않습니다.

  • execution
    : 메서드 실행 조인트 포인트를 매칭한다.
    : 스프링 AOP에서 가장 많이 사용하며, 기능도 복잡하다.

  • this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트

  • target : Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트

  • @target : 실행 객체의 클래스에 주어진 타입의 애너테이션이 있는 조인 포인트

  • within : 특정 타입 내의 조인 포인트를 매칭한다.

  • @within : 주어진 애너테이션이 있는 타입 내 조인 포인트

  • args : 인자가 주어진 타입의 인스턴스인 조인 포인트

  • @args : 전달된 실제 인수의 런타임 타입이 주어진 타입의 애너테이션을 갖는 조인 포인트

  • bean : 스프링 전용 포인트컷 지시자이고 빈의 이름으로 포인트컷을 지정한다.

  • @annotation : 메서드가 주어니 애너테이션을 가지고 있는 조인 포인트를 매칭

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)
  • anyPublicOperation은 메서드 실행 조인 포인트가 공용 메서드의 실행을 나타내는 경우 일치합니다.
  • in Trading 메서드 실행이 거래 모듈에 있는 경우에 일치합니다.
  • 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)

0개의 댓글