본문 바로가기

개발자노트/Spring

Spring AOP Joinpoint 바인드 변수

※ joinpoint(조인포인트)

수행중인 포인트컷
joinpoint를 인자로 가지게되면(pjp처럼) 현재 수행중인 비즈니스메서드의 시그니처 등을 알 수 있음

pjp = ProceedingJoinPoint

 

 

※ 바인드 변수

Object returnObj
설정을 해준다면, 비즈니스메서드의 반환값을 바인드 변수에 자동으로 매핑해준다.

 

동적바인딩에 바인딩과 비슷하다!

 

 

 

 

@ 어노테이션을 이용하여 AOP 설정하는 방법

 

xml파일에서 스프링 컨테이너에게
지금부터 AOP 설정을 @ 으로 한다는 것을 명시해주어야함
<aop:aspectj-autoproxy>

→  aspect를 하려면
포인트컷 + 횡단관심

 

 

 

1) 포인트컷을 설정
연결하고자하는 횡단관심이 작성된 클래스에서 설정가능
@Pointcut

 

 

 

2) 횡단관심이 aspectj 될 시기를 설정

 

 

 

3) 객체를 Service(Component)를 통해 Bean으로 등록,

    Aspect 된 횡단관심 클래스라는 것을 지칭해주기 위해 @Aspect를 작성 

 

 

 

❗ 그렇다면 PointCut 들만 별도로 모아 클래스로 관리하면 어떨까?

 

PointCut만 모아둔 클래스를 만들고 이 PointCut과 횡단관심과의 결합을 위한 Aspect라는 것을 명시해준다.

이 때, 클래스명이 Aepect나 Pointcut이면 오류가 발생하니 PointCut으로 만들었다.

 

그 후 , 역시 결합을 위한 @Aspect를 명시해주고,

@Before 뒤에는 ("PointCut 클래스의 aPointcut() " ) 이라는 것을 명시해주면 된다.

 

결과적으로,

    <bean id="La" class="com.kim.biz.common.LogAdvice" />
	<bean id="ara" class="com.kim.biz.common.AfterReturningAdvice" />
	<bean id="at" class="com.kim.biz.common.AfterThrowingAdvice" />
	<bean id="aa" class="com.kim.biz.common.AroundAdvice" />
	
	<aop:config>

		<aop:pointcut id="aPointcut" expression="execution(* com.kim.biz..*Impl.*(..))" />
		<aop:pointcut id="bPointcut" expression="execution(* com.kim.biz..*Impl.select*(..))" />
	

		<aop:aspect ref="La">
			<aop:before pointcut-ref="aPointcut" method="printLog" />
		</aop:aspect>
		
      <aop:aspect ref="ara">
         <aop:after-returning method="printLogAfterReturning" pointcut-ref="bPointcut" returning="returnObj" />
      </aop:aspect>
      
      <aop:aspect ref="at">
      		<aop:after-throwing method="AfterThrowing" pointcut-ref="bPointcut" throwing="exceptObj" />
      </aop:aspect>
   
   	<aop:aspect ref="aa">
		<aop:around pointcut-ref="aPointcut" method="printLogAround"/>
	</aop:aspect>
   
   
   
   </aop:config>

이정도 양의 xml 코드를

 

	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

이 한줄로 정리한 것이다.

 

 

그렇다면 이러한 의문점이 들 수 있을것이다.

모든 xml을 @(어노테이션) 화 하면 될텐데 왜 그러지 않을까?

그 이유는 우리가 만드는 클래스는 @를 달 수 있지만,
DataSource나 Class를 외부로부터 제공받으면 @를 할 수 없다.

 

이를 다룬 내용은 다음 내용에 포스팅하겠다.