[ Spring ] AOP ( Aspect Oriented Programming ) - 핵심 관심 호출하기 ( 사용된 인자와 메서드명, 반환 값 확인 하기 )
Advice ( 횡단 관심, 공통 로직 )를 효율적으로 사용하려면,
핵심 관심( 비즈니스 메서드, CRUD )을 알아야 한다.
이때, JoinPoint 가 제공되고, 핵심 관심을 넣어주는 것은 컨테이너의 역할이다.
< 사용된 인자와 메서드명 확인 >
어제 사용한 LogAdvice를 다음과 같이 수정한다.
1. Join Point를 인자로 지정해주어 자동으로 초기화될 수 있도록 해준다.
2. jp.getSignature( )와 getName()을 통하여 메서드의 이름을 호출할 수 있게 작성해준다.
3. System.out.println("호출된 핵심관심 : "+ methodName); 을 작성하여 값을 확인할 수 있도록 해준다.
4. Object배열에서 getArgs( ) 메서드로 해당 메서드에 사용된 인자를 확인할 수 있게 된다.
public class LogAdvice {
public void printlog(JoinPoint jp) { // jp애는 어떤 핵심관심이 호출되었는지에 대한 정보가 담겨있다!
String methodName = jp.getSignature().getName();
System.out.println("호출된 핵심관심 : "+ methodName);
Object[] args = jp.getArgs();
System.out.println("사용된 인자");
for(Object v : args) {
System.out.println(v);
}
}
}
5. XML 파일에서 method와 pointcut을 수정해주면 아래 consol에서 결과를 확인할 수 있다.
<aop:aspect ref="log">
<aop:before method="printlog" pointcut-ref="bPointcut"/>
</aop:aspect>
<aop:aspect ref="log2">
<aop:after method="printlog2" pointcut-ref="aPointcut"/>
</aop:aspect>
</aop:config>
< 반환 값 확인 >
ReturnObj 바인딩 개념을 통해 메서드로 인해 반환된 output을 확인할 수 있다.
1. Join Point에 접근하여 사용된 메서드의 name을 호출하고, returnObj에 접근하여 반환된 값을 확인할 수 있다.
2. 반환값이 MemberVO로 캐스팅( 형 변환 )이 가능한지 확인한 후 로직이 수행될 수 있도록 한다.
이때, 캐스팅( 형 변환 )은 returnObj가 더 상위 개념이므로 다운 캐스팅 해준다.
package com.test.app.common;
import org.aspectj.lang.JoinPoint;
import com.test.app.member.MemberVO;
public class LogAdvice2 {
public void printlog2(JoinPoint jp, Object returnObj) { // Object returnObj 바인드 변수
String methodName = jp.getSignature().getName();
System.out.println("호출된 핵심관심 : "+ methodName);
if(returnObj instanceof MemberVO) { // 캐스팅 가능 여부를 확인하는 로직
MemberVO vo = (MemberVO)returnObj; // 다운캐스팅
System.out.println("반환값: "+returnObj);
if(vo.getRole().equals("ADMIN")) {
System.out.println("+++++ ADMIN +++++");
}
else {
System.out.println(" 일반사용자 입장 ");
}
}
else {
System.out.println("알수없는 반환값입니다.");
}
}
}
3. XML파일에서 method명과 returning을 추가해준다.
<aop:aspect ref="log2">
<aop:after-returning method="printlog2" pointcut-ref="bPointcut" returning="returnObj" />
</aop:aspect>
</aop:config>
4. Client에서 실행하면 아래와 같은 결과를 확인할 수 있다.