클라이언트가 호출하는 모든 비즈니스 메소드를 조인 포인트(Join Point)라고 하는데, 이전 시간에서 했던 것처럼 AOP를 구현하게 되면 이러한 모든 조인 포인트에 대해서 AOP가 수행될 것이다. 따라서 이를 막기 위해 사용되는 것이 포인트 컷(Point Cut)이다. 포인트 컷이란 특정 조건에 의해 필터링된 조인 포인트로, 수많은 조인포인트 중에 특정 메소드에서만 AOP를 수행시키기 위해서 사용한다.
그렇다면 포인트 컷을 구현해보도록 하자.
xml 파일을 열어 다음과 같이 수정해주었다.
<bean id="classicPointCut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="total" />
</bean>
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice" />
<property name="pointcut" ref="classicPointCut" />
</bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="target" />
<property name="interceptorNames">
<list>
<value>logAroundAdvice</value>
<value>classicBeforeAdvisor</value>
<value>logAfterReturningAdvice</value>
<value>logAfterThrowingAdvice</value>
</list>
</property>
</bean>
보다시피 NameMatchMethodPointcut 클래스의 객체로 classicPointCut을 생성하였는데, 이는 조인 포인트를 필터링하기 위한 것이다.
다음으로는 DefaultPointcutAdvisor 클래스의 객체로 classicBeforeAdvisor을 생성하였는데, 이는 포인트 컷을 적용시킬 Advice와 해당 Advice에 적용시킬 포인트 컷을 지정하기 위한 것이다.
이후 기존에 <list> 태그에 원래의 클래스 이름이 들어가 있었던 Before Advice 클래스의 객체를 DefaultPointcutAdvisor 클래스의 객체인 classicBeforeAdvisor로 변경함으로써 포인트 컷을 적용시킬 수 있다.
실행 결과를 살펴보면 total 함수에 대해서만 Before Advice가 수행된 것을 확인할 수 있다.
위와 같은 방식으로 포인트 컷을 적용시킬 경우 Advice 하나당 Advisor를 하나씩 구현해야 하는 번거로움이 있다. 따라서 포인트 컷을 조금 더 편하게 적용시키기 위해 포인트 컷을 포함하고 있는 Advisor를 사용할 수 있다.
이를 위해 xml 파일을 아래와 같이 수정해주었다.
<!-- <bean id="classicPointCut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="total" />
</bean> -->
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice" />
<property name="patterns" value="total" />
</bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="target" />
<property name="interceptorNames">
<list>
<value>logAroundAdvice</value>
<value>classicBeforeAdvisor</value>
<value>logAfterReturningAdvice</value>
<value>logAfterThrowingAdvice</value>
</list>
</property>
</bean>
Advisor 객체의 클래스를 NameMatchMethodPointcutAdvisor, 즉 포인트 컷을 포함하는 Advisor로 바꾸어 기존에 포인트 컷을 지정하기 위한 구문을 없애고, Advisor 객체를 생성하는 부분에 <property> 부분만 복사해주었다. 이후 실행해보면 똑같은 결과를 출력하는 것을 확인할 수 있다.
만약 포인트 컷을 지정하고 싶은 메소드가 여러 개 있다면 <list> 태그를 이용하여 추가할 수 있다.
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice" />
<property name="patterns">
<list>
<value>total</value>
<value>avg</value>
</list>
</property>
</bean>
추가로, 만약 포인트 컷을 지정하고 싶은 메소드의 개수가 너무 많아 특정한 형식을 이용하여 지정하고 싶다면 정규 표현식(Regular Expression)을 사용할 수도 있다.
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice" />
<property name="patterns">
<list>
<value>.*to.*</value>
<value>avg</value>
</list>
</property>
</bean>
RegexpMethodPointcutAdvisor 클래스의 객체로 생성한 뒤, 위와 같이 '.*to.*'의 정규 표현식을 작성하게 되면 'to'라는 문자열을 포함하고 있는 모든 메소드에 포인트 컷이 지정될 것이다.
'🍃 Spring, Spring Boot > 스프링 프레임워크 기초' 카테고리의 다른 글
[Java / Spring] 10. 메이븐을 이용한 기본 웹 프로젝트 생성하기 (0) | 2022.04.17 |
---|---|
[Java / Spring] 0. 메이븐 프로젝트 생성시 pom.xml 오류 해결 (0) | 2022.04.17 |
[Java / Spring] 8. 스프링으로 AOP 구현해보기 (0) | 2022.04.17 |
[Java / Spring] 7. 순수 자바로 AOP 구현해보기 (0) | 2022.04.17 |
[Java / Spring] 6. XML Configuration을 Java Configuration으로 변경하기 (0) | 2022.04.11 |