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
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] Spring의 로드타임 위버 (0) | 2022.10.17 |
---|---|
[Spring] AspectJ로 bean이 아닌 오브젝트에 DI 적용하기 (0) | 2022.10.13 |
[Spring] 자바 코드를 이용한 MVC 전략 설정 (0) | 2022.10.06 |
[Spring] @RequestMapping 심화(2) - Spring 3.1의 RequestMapping 전략 (0) | 2022.10.03 |
[Spring] AnnotationMethodHandlerAdapter의 확장 (0) | 2022.09.29 |
댓글