앞서 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 수행 순서 적용 등.. ) 에 대하여 

설명하겠다.

'Framework > SpringBoot' 카테고리의 다른 글

[ 3 ] AOP 사용 예제  (0) 2021.06.14
[ 1 ] AOP 는 무엇인가?  (0) 2021.04.22

+ Recent posts