본문 바로가기
Back/Spring

[Spring] 스프링 AOP - 포인트컷 / 포인트컷 지시자의 종류 / execution / @target / @within

by 오엥?은 2023. 5. 25.
반응형

 

포인트컷 지시자

포인트컷 표현식은 execution 같은 포인트컷 지시자(Pointcut Designator)로 시작한다. (줄여서 PCD)

 

◽ 포인트컷 지시자의 종류

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

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

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

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

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

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

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

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

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

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

 

 

가장 많이 사용하는 것은 execution 문법이다.

 

◽ execution 문법

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-
pattern(param-pattern)
        throws-pattern?)
 
execution(접근제어자? 반환타입 선언타입?메서드이름(파라미터) 예외?)

 

• 메소드 실행 조인 포인트를 매칭한다.

• ? 는 생략할 수 있다.

• * 같은 패턴을 지정할 수 있다.

 

➕ 패키지에서 . , ..  의 차이를 이해해야 한다.

. : 정확하게 해당 위치의 패키지

.. : 해당 위치의 패키지와 그 하위 패키지도 포함

 

◽ execution 파라미터 매칭 규칙

(String) : 정확하게 String 타입 파라미터

() : 파라미터가 없어야 한다.

(*) : 정확히 하나의 파라미터, 단 모든 타입을 허용한다.

(*, *) : 정확히 두 개의 파라미터, 모든 타입을 허용한다. 참고로 파라미터가 없어도 된다. 0..* 로 이해하면 된다.

(String, ..) : String 타입으로 시작해야 한다. 숫자와 무관하게 모든 파라미터, 모든 타입을 허용한다. 

 예) (String), (String, Xxx), (String, Xxx, Xxx) 허용

 

 

◽ @target, @within

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

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

 

 ➕ @target, @within 은 다음과 같이 타입에 있는 애노테이션으로 AOP 적용 여부를 판단한다.

• @target(hello.aop.member.annotation.ClassAop)

• @within(hello.aop.member.annotation.ClassAop)

 

@target vs @within

• @target 은 인스턴스의 모든 메서드를 조인 포인트로 적용한다.

• @within 은 해당 타입 내에 있는 메서드만 조인 포인트로 적용한다.

 

@target 은 부모 클래스의 메서드까지 어드바이스를 다 적용하고, @within 은 자기 자신의 클래스에 정의된 메서드에만 어드바이스를 적용한다.

 

@target / @within

 

 

 

참고 : 인프런 ) 스프링 핵심 원리 - 고급편 (김영한)

 

 

 

 

반응형