앞서 AOP 란 무엇인가? 에 대해 간략하게 정리해보았다.
그럼 AOP 를 사용하기 위해 표현은 어떻게 하는지 알아보자.
앞의 이야기를 종합해보면 Pointcut 은 Advice 가 적용될 비지니스 로직 또는 메소드를 지정한다고
생각할 수 있다.
즉 지정 경로에 있는 지정 Class 내 모든 메소드 또는 지정 경로의 모든 메소드에 Advice 를
적용할 수 있게 하는 필터링이다.
포인트컷을 사용하는 지시자는 3가리로 나눌 수 있다.
1. execution : 페키지 경로, 클래스명을 이용하여 Advice 수행 메서드를 지정할 수 있다.
2. within : 지정한 경로(package) 하위 모든 메서드를 지정한다.
3. bean : SpringMVC 2.5 버전부터 사용가능하며, Bean 이름을 이용하여 메서드를 지정한다.
[ execution 표현식 ]
: 개인적으로 가장 확장성 있고, 디테일하게 포인트컷을 만들 수 있는 방법이라고 생각된다.
표현식은 아래 A ~ D 까지의 순서를 따라가면서 설정한다.
( 표현식 내 * : 모든 값 표현 , .. : 하위경로 또는 복수개 를 의미 )
A) 수식어 선언
- 메서드의 public, protected 등을 선언
( 생략가능. - 개인적으론 그냥 생략해서 사용함 )
B) 리턴타입 선언
- 메서드의 리턴타입 ( * , void , !void )
* : 모든 리턴타입에 적용
void : 리턴 타입이 void 인 메서드 적용
!void : 리턴 타입이 void 가 아닌 메서드 적용
C_1) package 선언
- Advice 가 적용될 package 에 지정된 클래스 또는 클래스명 패턴을 명시한다.
Ex_1) com.foxy.wany.test : 경로를 구체적으로 명시.
Ex_2) com.foxy.wany.. : com.foxy.wany 이하 하위 경로
C_2) class 선언
- Advice가 적용될 메서드를 지정한다. 단, 위 C_1 에 선언된 경로 내에서의 메서드이다.
EX_1) AopTest : 클래스 명만 명시. 지정된 Class 만 Advice 대상
EX_2) *Test : Test 로 끝나는 클래스들이 Advice 대상
EX_3) Aop* : Aop로 시작하는 클래스들이 Advice 대상
EX_4) AopTest+ : AopTest 클래스로부터 파생된 모든 자식 클래스가 대상 인터페이스
뒤에 + 가 붙으면, 인터페이스를 구현한 모든 클래스가 대상
D) 메서드 parameter 명시
- Advice 가 적용될 메서드 parameter 갯수를 지정한다.
단, 위 C_1 & C_2 조건에 부합되어야 한다.
( 전부를 표현해도 무관하다. )
EX_1) *(..) : 모든 메서드가 대상
EX_2) *(*) : 매개변수가 1개인 모든 메서드 대상.
EX_3) *(*, *) : 매개변수가 2개인 모든 메서드 대상.
EX_4) *(String, ..) : 첫번째 매개변수 타입은 String 이며, 1개 이상의 매개변수를 가지는 메서드 대상
EX_5) WanyMethod*(..) : 메서드명이 WanyMethod 로 시작하는 모든 메서드가 대상
EX_5) *Method(..) : 메서드명이 Method 로 끝내는 모든 메서드 대상
위 A ~ D 까지를 종합하여 Spring에서 Before 단계의 execution 예제이다.
@Before( "execution(* com.foxy.wany..*Test.Wany*(..) )" ) public void beforeAOP( JoinPoint jp ) { ..... }
--> 위 Pointcut 내용은 다음과 같다. * : public , protected .. 무관 com.foxy.wany.. : com.foxy.wany 패키지 이하 모든 경로 에서 *Test : Test 로 끝나는 클래스 내에 선언된 메서드들 중 .Wany*(..) : Wany 로 시작하는 모든 메서드(매개변수 무관) 들은 beforeAOP 의 대상이 된다.
|
[ within 표현식 ]
- 특정 타입 (Interface , Class) 에 속하는 메서드 대상.
EX_1) com.foxy.wany.* : com.kcp.wany 내 모든 메소드 호출
EX_2) com.foxy.wany..* : com.kcp.wany 패키지 & 하위 패키지 내 모든 메소드
@Around( "within(com.foxy.wany..*)" ) public Object withinTest( ProceedingJoinPoint proceedJP ) { .... } |
[ BEAN 표현식 ]
- Spring Bean 에 등록된 Bean ID 를 패턴으로 설정
@After( "bean(ktwAopTest)" public void afterAopTest( JoinPoint jp ) { .... 수행 .... }
@Component public TestAopClass { @Bean( name = "ktwAopTest" ) public void aopBeanMethod() { . . . . } }
|
다음은 Spring AOP 의 간단한 예제와 활용 ( 예외 처리, Aop 수행 순서 적용 등.. ) 에 대하여
설명하겠다.