포인트컷을 이용하면 어드바이스 메소드가 적용될 비즈니스 메소드를 정확하게 필터링 할 수 있음
( ※ Pointcut : 특정 조건에 의해 필터링된 Joinpoint, 수많은 Joinpoint 중에 특정 메서드에서만 공통기능(횡단관심사)을 수행시키기 위해서 사용한다)
지시자(PCD, AspectJ pointcut designators)의 종류
(PCD : 흔히 우리가 사용하고 있는 execution이라든지 @annotation 지정자를 PointCut Desinator라 하여 통상 "PCD"라 불림
PCD는 타깃의 여러 Joinpoint 중에 어드바이스를 어디에 적용을 시킬지, AOP에게 알려주는 키워드라고 할 수 있음)
1. execution : 가장 정교한 포인트컷을 만들 수 있음
리턴타입 패키지경로 클래스명 메서드명(매개변수)
예시)
<aop:pointcut id="logAspectPointCut" expression="execution(public * co.kr.mono.aop.entity.Person.*(..))>"
co.kr.mono.aop.entity 패키지에 있는 Person 클래스의 모든 메서드(매개변수)
2. within : 타입패턴 내에 해당하는 모든 것들을 포인트컷
3. bean : bean 이름으로 포인트컷
리턴타입 지정
표현식 | 설명 |
* | 모든 리턴타입 허용 |
void | 리턴타입이 void인 메서드 선택 |
!void | 리턴타입이 void가 아닌 메서드 선택 |
패키지 지정
표현식 | 설명 |
co.kr.mono.aop.entity | 정확하게 co.kr.mono.aop.entity 패키지만 선택 |
co.kr.mono.aop.entity.. | co.kr.mono.aop.entity.. 패키지로 시작하는 모든 패키지 선택 |
co.kr.mono.aop.entity..impl | co.kr.mono.aop.entity.. 패키지로 시작하고 마지막 패키지 이름이 impl로 끝나는 패키지 선택 |
클래스 지정
표현식 | 설명 |
Printer | 정확하게 Printer 클래스만 선택 |
*Printer | 이름이 Printer로 끝나는 클래스만 선택 (ColorPrinter, MonoPrinter) |
Printer+ | 해당 클래스로 파생된 모든 자식 클래스 선택, 인터페이스 구현된 모든 클래스 선택 |
BasicObject | 클래스 이름 뒤에 '+'가 붙으면 해당 클래스로부터 파생된 모든 자식 클래스 선택, 인터페이스 이름 뒤에 해당 인터페이스를 구현한 모든 클래스 선택 |
메서드 지정
표현식 | 설명 |
*(..) | 모든 메서드 선택 |
print*(..) | 메서드명이 print로 시작하는 모든 메서드 선택 |
매개변수지정
표현식 | 설명 |
(..) | 모든 매개변수 |
(*) | 반드시 1개의 매개변수를 가지는 메서드만 선택 |
(com.devljh.domain.user.model.User) | 매개변수로 User를 가지는 메소드만 선택. 꼭 풀패키지명이 있어야함 |
(!com.devljh.domain.user.model.User) | 매개변수로 User를 가지지않는 메소드만 선택 |
(Integer, ..) | 한 개 이상의 매개변수를 가지되, 첫번째 매개변수의 타입이 Integer인 메서드만 선택 |
(Integer, *) | 반드시 두 개의 매개변수를 가지되, 첫번째 매개변수의 타입이 Integer인 메서드만 선택 |
JoinPoint 인터페이스
횡단 관심사에 해당하는 advice 메서드를 의미있게 구현하기 위해서는
클라이언트가 호출한 비즈니스 메서드의 정보가 필요하다
ex) After Throwing 어드바이스 메서드를 구현할 때, 예외발생 메서드 이름이 무엇이며, 해당 메서드가 속한 클래스,
패키지 정보가 무엇인지 등등을 정확한 예외처리 로직을 구현할 수 있게 된다
스프링에서는 이런 다양한 정보들을 이용할 수 있도록 하기 위해서 JoinPointing 인터페이스를 제공한다
Spring JoinPoint에서 제공하는 메서드들
Signature getSignature()
- 클라이언트가 호출한 메서드의 시그니처 (리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체를 리턴
- getSignature() 메서드가 리턴하는 Signature 객체를 사용하면
호출되는 메서드에 대한 다양한 정보를 얻을 수 있는데
Signature 객체가 제공하는 메서드들은 다음과 같음
String getName() | 클라이언트가 호출한 메서드 이름 리턴 |
String toLongString() | 클라이언트가 호출한 메서드의 리턴타입, 이름, 매개변수를 패키지 경로까지 포함해서 리턴 |
String toShortString() | 클라이언트가 호출한 메서드의 시그니처를 축약한 문자열로 리턴 |
Object getTarget()
- 클라이언트가 호출한 비즈니스 메서드를 포함하는 비즈니스 객체를 리턴
(해당 클래스 객체를 리턴)
Object[] getArgs()
- 클라이언트가 메서드를 호출할 때 넘겨준 인자 목록을 Object 배열로 리턴
참고출처
https://sjh836.tistory.com/157
http://closer27.github.io/backend/2017/08/03/spring-aop/
https://heidish.tistory.com/70
'Java > Spring' 카테고리의 다른 글
[Spring] Bean 설정, 컴포넌트 스캔(Component Scan) (0) | 2021.06.01 |
---|---|
[Spring/MyBatis] MyBatis? (0) | 2021.05.28 |
[Spring] 스프링 AOP(관점지향 프로그래밍, Aspect-Oriented-Programming) (1) | 2021.05.24 |
[Spring] Maven? (0) | 2021.05.23 |
[Spring] IoC (제어 역전, Inversion Of Control) / DI (의존성 주입, Dependency Injection) (0) | 2021.05.20 |
댓글