본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] AOP 포인트컷 표현식

by 김코더 김주역 2022. 10. 12.
반응형

1. 지시자의 종류

- 메소드가 아닌 오브젝트를 선정하는 경우에는 해당 오브젝트 안에 있는 메소드들이 AOP 적용 대상이 된다.

 

1) execution()

- 표현식 언어를 사용해서 포인트컷을 작성하는 방법이다.

- 메소드의 모든 특징을 문자열로 나타내어 비교하는 방식이다.

- AspectJExpressionPointcut 클래스를 이용하여 클래스와 메소드 이름의 패턴을 한 번에 지정할 수 있다.

※ AspectJ AOP를 사용하면 스프링 bean이 아닌 일반 오브젝트에도 aop 기능을 적용할 수 있다. 

- OR(|) 조건에 대해서도 지정할 수 있다.

execution([접근제한자] 리턴타입 [클래스타입.]메소드명(파라미터타입 | "..", ...) [throws 예외클래스]

※ 접근제한자 : 생략하면 모든 접근제한자가 허용된다.

※ 리턴타입 : "*"를 사용하여 모든 타입을 선택하는 것도 가능하다.

※ 클래스(인터페이스)타입 : 패키지와 클래스 타입 이름을 포함한 타입 패턴으로, 생략하면 모든 클래스타입이 허용된다. "*", ".."도 사용할 수 있는데,  ".."는 서브패키지를 포함한다는 의미다. 가급적 인터페이스로 적용하는 것을 권장한다.

※ 메소드명 : "*"를 사용할 수 있다.

※ 파라미터타입 : 메소드의 파라미터 타입을 ","로 구분하면서 파라미터 타입 패턴을 순서대로 넣는다. 파라미터의 타입과 개수에 상관없이 모두 다 허용하려면 ".."를 넣으면 된다. 또, "..."를 이용해서 뒷 부분부터 나오는 파라미터 조건을 생략할 수도 있다.

 

예시

execution(* *(..)) : 모든 메소드를 선택
execution(* *(int, int)) : 파라미터가 (int, int)인 메소드를 선택
execution(* add(..)) : 모든 add 메소드를 선택
execution(* *..Tar*.*(..)) : "Tar"로 시작하는 클래스의 메소드를 선택
execution(* *..TargetInterface.*(..)) : TargetInterface 인터페이스의 구현체의 메소드를 선택
execution(* *(..) throws Runtime*) : "Runtime"으로 시작하는 예외 클래스를 던지는 메소드를 선택

 

 

2) bean()

- Bean의 id 또는 name을 통해 선정하는 방법이다.

bean(*Service) : Bean의 id 또는 이름이 "Service"로 끝나는 bean을 선택

 

 

3) within()

- 타입 패턴만을 이용해 선정하는 방법이다.

within(com.example.demo.*) : com.example.demo 패키지 안에 있는 모든 메소드
within(com.example.demo..*) : com.example.demo 패키지 및 하위 패키지 안에 있는 모든 메소드

 

 

4) this(), target()

- 하나의 타입을 지정하는 방법이다.

- this()는 프록시 오브젝트의 타입(일반적으로 인터페이스 타입)을 기준으로 선정하고, target()은 타깃 오브젝트의 타입(인터페이스 타입과 구현체 타입)을 기준으로 선정한다.

 

 

5) args()

- 메소드의 파라미터 타입만을 이용해 메소드를 선정하는 방법이다.

args(String, ..) : 첫 번째 파라미터가 String이면서 파라미터의 개수가 하나 이상인 메소드를 선택
args(String, *) : 파라미터의 개수가 2개면서 첫 번째 파라미터가 String인 메소드를 선택

 

 

6) @annotation()

- 메소드에 특정 어노테이션이 있는 것만 선정하는 방법이다.

@annotation(org.springframework.transaction.annotation.Transactional) : @Transactional가 적용된 메소드를 선택

- 유연하고 구체적인 속성 제어는 가능하지만, 동일한 속성 정보를 가진 어노테이션을 메소드마다 반복적으로 부여해야될 수도 있다.

 

 

7) @target, @within

- 하나의 타입을 지정한다.

- @target()은 타깃 오브젝트에 특정 어노테이션이 있는 것만 선정한다.

@target(org.springframework.transaction.annotation.Transactional)

- @within()은 타깃 오브젝트의 클래스에 특정 어노테이션이 있는 것만 선정한다.

 

 

8) @args

- 파라미터를 이용해 선정한다는 점은 args()와 같지만, 파라미터의 오브젝트에 지정된 어노테이션이 기준이 된다.

@args(com.example.demo.annotation.SecretObject)

 

 

 

2. 포인트컷의 조합

- 포인트컷 표현식은 논리연산 기호를 이용해서 포인트컷 지시자 또는 포인트컷 자체를 조합할 수 있다. 포인트컷 표현식 안에 다른 포인트컷 이름을 사용할 수도 있다.

 

1) &&

- 여러 포인트컷 또는 지시자를 AND 조건으로 결합한다. 아래 예시에서 timer()은 메소드로 지정한 포인트컷의 이름(메소드의 이름)이다.

within(com.example.demo.*) && timer()

 

@Pointcut(...)
private void timer() {}

 

2) ||

- 여러 포인트컷 또는 지시자를 OR 조건으로 결합한다.

 

3) !

- NOT 조건을 적용한다. ! 뒤에 나오는 조건에 해당하는 것을 제외한다.

 

 

● 참고 자료 : 토비의 스프링 3.1

 

 

 

 

반응형

댓글