[Spring AOP] 포인트컷 표현식 - execution

목차

포인트컷 표현식 - execution

execution( [접근제어자] 리턴타입 [선언타입] 메소드이름(파라미터) [예외] )

execution은 포인트컷 표현식에서 가장 많이 사용되는 지시자입니다.

메소드의 접근 제어자, 리턴 타입, 선언된 패키지 및 클래스, 파라미터, 예외 정보를 조합해 다양한 조건으로 포인트컷을 정의할 수 있습니다.

대괄호([ ])로 표시된 접근제어자, 선언타입, 예외는 생략이 가능합니다.

기본 사용 예시

execution(public String com.example.aop.member.MemberServiceImpl.hello(String))
구성 요소
접근 제어자 public
리턴 타입 String
선언 타입 com.example.aop.member.MemberServiceImpl
메소드 이름 hello
파라미터 String
예외 생략

모든 메소드를 대상으로 하는 포인트컷

모든 리턴 타입이나 메소드 이름을 대상으로 하려면 와일드카드 *를 사용하고, 0개 이상의 파라미터를 표현하려면 ..를 사용합니다.

execution(* *(..))
구성 요소
접근 제어자 생략
리턴 타입 모든 타입
선언 타입 생략
메소드 이름 모든 메소드
파라미터 0개 이상
예외 생략

execution - 메소드 이름 지정

execution( [접근제어자] 리턴타입 [선언타입] 메소드이름(파라미터) [예외] )

특정 메소드 이름을 명시하면 해당 메소드에만 Advice가 적용됩니다. *를 조합하면 이름이 특정 패턴으로 시작하거나 포함되거나 끝나는 메소드에도 적용할 수 있습니다.

// 메소드 이름이 정확히 hello인 경우
execution(* hello(..))

// hel 로 시작하는 메소드
execution(* hel*(..))

// 이름에 el 이 포함된 메소드
execution(* *el*(..))

execution - 선언 타입 지정

execution( [접근제어자] 리턴타입 [선언타입] 메소드이름(파라미터) [예외] )

선언 타입은 패키지클래스 정보로 구성됩니다. 이를 활용해 특정 클래스, 패키지, 하위 패키지, 또는 상위 타입(인터페이스/추상 클래스)을 기준으로 Advice를 적용할 수 있습니다.

1. 특정 패키지 내 클래스 지정

패키지와 클래스를 명시하면 해당 클래스의 메소드에 Advice가 적용됩니다.

execution(* com.example.aop.member.MemberServiceImpl.hello(..))

2. 패키지 내 모든 클래스에 적용

클래스 위치에 *를 사용하면 해당 패키지의 모든 클래스에 Advice가 적용됩니다. 단, 하위 패키지는 포함되지 않습니다.

// com.example.aop.member 패키지 내 모든 클래스에 적용
execution(* com.example.aop.member.*.*(..))

// com.example.aop.member 패키지는 포함되지 않음 (하위 패키지가 아님)
execution(* com.example.aop.*.*(..))

3. 하위 패키지까지 적용

패키지 경로에 ..를 사용하면 하위 패키지의 클래스까지 Advice가 적용됩니다.

// com.example.aop.member 및 하위 패키지 모두 적용
execution(* com.example.aop.member..*.*(..))

// com.example.aop 및 하위 패키지 모두 적용
execution(* com.example.aop..*.*(..))

4. 부모 타입 지정 (인터페이스 / 상위 클래스)

부모 타입을 지정하면 해당 타입을 구현하거나 상속한 자식 타입에도 Advice가 적용됩니다.

단, 부모 타입에 선언된 메소드에만 적용되며, 자식 타입에서 추가로 선언한 메소드는 포인트컷 대상이 되지 않습니다.

// MemberService(인터페이스)를 구현한 타입의 메소드에 적용
execution(* com.example.aop.member.MemberService.*(..))
// MemberServiceImpl 에서만 선언된 internal() 메소드는 매칭되지 않음
pointcut.setExpression("execution(* com.example.aop.member.MemberService.*(..))");
Method internalMethod = MemberServiceImpl.class.getMethod("internal", String.class);
assertThat(pointcut.matches(internalMethod, MemberServiceImpl.class)).isFalse();

execution - 파라미터 지정

execution( [접근제어자] 리턴타입 [선언타입] 메소드이름 (파라미터) [예외] )

파라미터 패턴을 통해 특정 타입, 개수, 조합의 파라미터를 가진 메소드에 Advice를 적용할 수 있습니다.

// String 타입 파라미터 하나를 가진 메소드
execution(* *(String))

// 파라미터가 없는 메소드
execution(* *())

// 타입 무관하게 파라미터가 정확히 하나인 메소드
execution(* *(*))

// 파라미터 개수·타입 무관하게 모든 메소드
execution(* *(..))

// 첫 번째 파라미터가 String이고 이후 파라미터는 무관한 메소드
execution(* *(String, ..))
Share