Spring

[ Spring ] AOP ( Aspect Oriented Programming ) - 핵심 관심 호출하기 ( 사용된 인자와 메서드명, 반환 값 확인 하기 )

dauneee 2022. 4. 7. 13:30

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에서 실행하면 아래와 같은 결과를 확인할 수 있다.