째로스 2023. 6. 16. 12:49

1. 포인트 컷이란?

AOP를 적용할 때 해당 객체의 모든 메소드에 적용하는 것이 아닌,

개발자가 원하는 특정 메소드만 AOP를 적용하는 것을 의미한다.

 

2. 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="classicAroundAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    <property name="advice" ref="logAroundAdvice"/>
    <property name="pointcut" ref="classicPointCut"/>
</bean>

logBeforeAdvice와 logAroundAdvice로 AOP를 실행할 때,

classicPointCut에 지정되어있는 total 메소드에만 AOP를 적용하여 실행한다는 의미이다.

 

<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target" ref="target"/>
		<property name="interceptorNames">
			<list>
				<!-- <value>logAroundAdvice</value> -->
				<value>classicAroundAdvisor</value>
				<!-- <value>logBeforeAdvice</value> -->
				<value>classicBeforeAdvisor</value>
				<value>logAfterReturningAdvice</value>
				<value>logAfterThrowingAdvice</value>
			</list>
		</property>
	</bean>

따라서 proxy에 주입해주는 객체로 기존의 logAroundAdvice -> classicAroundAdvisor로 위에 생성한 객체를

주입해줘야한다.

 

그렇다면 앞으로 total 메소드에만 AOP가 적용되고 그 외에 다른 메소드들에는 해당 핸들러가 AOP 기능을 수행하지

않게된다.

 

3. 코드 간략화

 <bean id="classicPointCut" class="org.springframework.aop.support.NameMatchMethodPointcut">
	<property name="mappedName" value="total"/>
</bean>

 위 코드를 삭제해도 특정 핸들러에 포인트컷을 지정할 수 있도록 간략화하는 코드를 소개하겠다.

 

 1) 하나의 메소드를 포인트컷으로 지정할 때

<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
    <property name="advice" ref="logBeforeAdvice"/>
    <property name="mappedName" value="total"/>
</bean>

 

 

2) 두 개 이상의 메소드를 포인트컷으로 지정할 때

<bean id="classicAroundAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
    <property name="advice" ref="logAroundAdvice"/>
    <!-- mappedNames 를 쓰면 포인터컷에 사용할 메소드 여러개 설정 가능 -->
    <property name="mappedNames">
        <list>
            <value>total</value>
            <value>avg</value>
        </list>
    </property>
</bean>

property name에 mappedName이 아닌 mappedNames를 쓴것에 유의한다.

 

3) 메소드명 패턴에 따른 포인트컷 지정

<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice" ref="logBeforeAdvice"/>
    <property name="patterns">
        <list>
            <value>.*to.*</value>
        </list>
    </property>
</bean>

메소드 이름에 to가 들어간 모든 메소드들에 AOP를 적용한다.

property name을 patterns으로 수정했으며, 빈객체 클래스도 변했음에 유의한다.