스프링 AOP (Aspect Oriented Programming)
* 포인트 컷 & 조인포인트
- 위빙 (Weaving) : 보조업무가 프록시(Proxy)를 통해서 주 업무에 주입되는 것. 즉, 타깃 객체에 애스펙트를 적용해서 새로운 프록시 객체를 생성하는 절차.
- 조인포인트 (Joint Point) : 위빙하게 되는 함수. 그 지점.
- 포인트 컷 (PointCuts) : 객체의 특정 함수만 조인포인트 역할을 하도록 하는 것.
* 이전 포스팅에서의 스프링 AOP 는 특정 객체(클래스)를 대상으로 타깃(Target)을 설정하였는데, 그렇기 때문에 프록시 적용이 해당 객체 단위 전체에 적용이 됨. 즉 타깃에 속한 모든 조인포인트에 보조 업무(Proxy Class)가 적용됨. 하지만, 포인트 컷을 활용하면 특정 클래스의 특정 함수에만 보조 업무를 삽입할 수 있음.
* 예제 코드
<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을 통한 동적 프록시 생성.
참고로 어드바이저에는 여러 개의 어드바이스와 포인트 컷이 추가 될 수 있기 때문에 개별적으로 등록 시 어떤 어드바이스(부가기능)에 대해 어떤 포인트컷(메소드 선정)을 적용 할지 애매해진다. 그래서 어드바이스와 포인트 컷을 묶은 오브젝트를 어드바이저라고 부른다.
어드바이저 = 포인트컷(메소드 선정 알고리즘) + 어드바이스(부가 기능, 애스펙트의 한가지 형태)
<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에 한정.
출처: http://ooz.co.kr/216?category=818548 [이러쿵저러쿵]
'Web Programming > spring' 카테고리의 다른 글
Spring MVC Model2 (0) | 2018.08.29 |
---|---|
Spring 빈 후처리기 (0) | 2018.08.29 |
Spring Advice (0) | 2018.08.29 |
Spring 디자인 패턴 (0) | 2018.08.29 |
Spring 동적 Proxy (0) | 2018.08.29 |