이러쿵저러쿵


스프링 AOP (Aspect Oriented Programming)

 

* 포인트 컷 & 조인포인트

 

 - 위빙 (Weaving) : 보조업무가 프록시(Proxy)를 통해서 주 업무에 주입되는 것. 즉, 타깃 객체에 애스펙트를 적용해서 새로운 프록시 객체를 생성하는 절차.
 - 조인포인트 (Joint Point) : 위빙하게 되는 함수. 그 지점.

 - 포인트 컷 (PointCuts) : 객체의 특정 함수만 조인포인트 역할을 하도록 하는 것.

 

 

* 이전 포스팅에서의 스프링 AOP 는 특정 객체(클래스)를 대상으로 타깃(Target)을 설정하였는데, 그렇기 때문에 프록시 적용이 해당 객체 단위 전체에 적용이 됨. 즉 타깃에 속한 모든 조인포인트에 보조 업무(Proxy Class)가 적용됨. 하지만, 포인트 컷을 활용하면 특정 클래스의 특정 함수에만 보조 업무를 삽입할 수 있음.

 

 

* 예제 코드

 

<bean id="cal" class="aoptest.TestCalculator"></bean>

<bean id="logPrintAroundAdvice" class="aoptest.LogPrintAroundAdvice"/>

<bean id="logPrintBeforeAdvice" class="aoptest.LogPrintBeforeAdvice"/>

<bean id="logPrintAfterReturningAdvice" class="aoptest.LogPrintAfterReturningAdvice"/>

<bean id="logPrintAfterThrowingAdvice" class="aoptest.LogPrintAfterThrowingAdvice"/>

 

<bean id="namePointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">

<proporty name="mappedNames">

         <list>

              <value>add</value>

              <value>subtract</value>

          </list>

     </property>

</bean>

 

<bean id="nameAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">

      <property name="pointcut" ref="namePointcut"></property>

      <property name="advice" ref="logPrintAroundAdvice"></property>

</bean>

 

<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">

    <property name="target" ref="cal"></property>

    <property name="interceptorNames">

        <list>

            <value>nameAdvisor</value>

            /* <value>logPrintAroundAdvice</value>

            <value>logPrintBeforAdvice</value>

            <value>logPrintAfterReturningAdvice</value>

            <value>logPrintAfterThrowingAdvice</value> */

        </list>

    </property>

</bean> 

 

 - 코드 설명 -

 

1)  특정 함수(add, subtract) 만 조인포인트 함수가 되도 록 포인트 컷 지정.
2) 특정 포인트 컷에 특정 어드바이스(핸들러) 지정.

 

어드바이저 = 포인트 컷 + 어드바이스


 

3) 특정 어드바이스(Advice) 대신 어드바이저(Advisor) 지정 가능.

 

* TestCalculator : 주 업무(타깃) 클래스 (AOP처리가 필요한 클래스)
* LogXXXAdvice : 어드바이스 클래스 (핸들러 클래스 – 주 업무 처리 이전, 이후 등 부가적인 업무를 처리할 클래스)
* PointCut(mappedNames) : 주 클래스의 함수 중에 내가 어드바이스를 적용을 한정(포인트 컷 할)시킬 함수를 지정 (특정 함수에만  국한지어 적용)
* Advisor(nameAdvisor) : 포인트컷과 어드바이스를 합친 어드바이저를 생성. 어드바이스 대신 어드바이저 사용가능.
* Proxy : 타깃 클래스를 지정하고, 어드바이저(또는 어드바이스)를 적용할 것(interceptorNames)을 지정한 후, 대리 클래스 생성. ProxyFactoryBean을 통한 동적 프록시 생성.

참고로 어드바이저에는 여러 개의 어드바이스와 포인트 컷이 추가 될 수 있기 때문에 개별적으로 등록 시 어떤 어드바이스(부가기능)에 대해 어떤 포인트컷(메소드 선정)을 적용 할지 애매해진다. 그래서 어드바이스와 포인트 컷을 묶은 오브젝트를 어드바이저라고 부른다.

 

어드바이저 = 포인트컷(메소드 선정 알고리즘) + 어드바이스(부가 기능, 애스펙트의 한가지 형태)

 

  

<bean id="nameAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">

    <property name="pointcut" ref="namePointcut"></property>

    <proporty name="mappedNames">

         <list>

              <value>add</value>

              <value>substract</value>

          </list>

     </property>

     <property name="advice" ref="logPrintAroundAdvice"></property>

</bean>

 

 

// JAVA 정규식 표현을 활용한 포인트 컷 패턴 설정.  

<bean id="nameAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

    <property name="pointcut" ref="namePointcut"></property>

    <proporty name="patterns">

         <list>

              <value>.*a.*</value>

              <value>.*b</value>

          </list>

     </property>

     <property name="advice" ref="logPrintAroundAdvice"></property>

</bean>

 

 

* mappedName : 적용시킬 함수를 지정.
* mappedNames : 적용시킬 함수들을 지정.

예제 클래스에는 2개의 함수(add, substract) 밖에 없지만, 함수가 상당히 많은 경우, 패턴을 사용하는 것이 더 효율적일 수 있다. 그룹핑을 통해 어떤 어드바이스(Advice)만 실행되게 할 것인지도 한정할 수도 있다.

[정규식 특수 문자 의미]

. : 어떠한 문자든 상관없다. (한개의 문자가 옴)
* : 임의의 문자가 0개 이상 올 수 있다. (한개 이상의 문자가 옴)

 

 

* 위빙, 조인포인트, 포인트컷을 다시 한 번 상기시키자면

위빙 : 크로스 컷팅 되어 있는 관심사(Concern)를 다시 결합하는 것.
조인포인트 : 위빙하는 함수들이 있는 곳 지점, 시점 (스프링에서는 메소드만을 조인 포인트로 사용함.)

포인트 컷 : 부가 기능 적용 대상 메서드 선정 방법. 내가 원하는 메서드만 골라서 조인포인트 역할을 하도록 함. (단, 포인트 컷을 통해 특정 타깃 함수와 어드바이스를 매 하나씩 연결해야 한다면 설정 파일의 용량도 커지고, 함수가 많아지게 되면 관리도 어려워질 수 있음.)

 

 * 스프링에서의  조인 포인트 특징!
  - 분리하고 도킹하는 것이 자유로움.
  - 조인포인트를 쓸 수 있는 것이 Method에 한정.

 

 

저작자 표시 비영리 변경 금지
신고

Comment +0

티스토리 툴바