2015년 11월 18일 수요일

Spring AOP + AspectJ annotation + Redis 샘플 #1



이 샘플 코드는 Redis 저장소를 이용하여 web app을 이용할 때 app 에서 제공하는 API 호출의 횟수 별 순위를 확인하는 간단한 예제이다.






AOP + RedisTemplate을 이용하여 구현하였다.


기본 AOP 어노테이션을 확인하자.
@Before – 지켜보고 있는 메소드의 실행 전
@After – 메소드의 결과 값이 리턴된 후
@AfterReturning – 2번 어노테이션과 동일하나 정상적으로 실행됐을 때만 동작.
@AfterThrowing – 오류가 났을 경우 동작
@Around – Proceed 호출 시점을 기준으로 앞과 뒤에서 동작


프로젝트는 spring mvc 프로젝트로 시작한다.

   org.springframework
   spring-aop
   ${org.springframework-version}
  
  
   org.aspectj
   aspectjrt
   1.6.11
  

  
   org.aspectj
   aspectjweaver
   1.6.11
  
  
  
   redis.clients
   jedis
   2.4.0
  
  
  
   org.springframework.data
   spring-data-redis
   1.2.1.RELEASE
  
  
   com.google.code.gson
   gson
   2.4
  
관점의 대상이 되는 인터페이스 및 상속 클래스 구현
public abstract interface Action {
 public abstract void doAct();

 public abstract void doActString(String paramString);

 public abstract void doActWithParam(String paramString, int paramInt);
}
@Component
public class ActImpl implements Action {
 public void doAct() {
  System.out.println("do Act");
 }

 public void doActString(String actParam) {
  System.out.println(actParam + " do act");
 }

 public void doActWithParam(String actParam, int actnum) {
  System.out.println(actParam + actnum + " do act");
 }
}
AspectJ , AOP xml 선언
 
 // AspectJ 기반으로 AOP 구동 시 필요
 
 
 

 
 
  
  
 
 
 
 
Aspect Class 구현 종류별로 필요한 관점을 모두 테스트 해볼 것을 추천한다.
@Aspect
public class ActionAspect {
        // action의 호출 횟수를 저장하는 저장소 주입
 @Autowired
 private ActionHistoryRepo saver;
        
        // AspectJ로 do로 시작하는 모든 메소드를 감시
 @Before("execution(* com.example.aop.ActImpl.do*(..))")
 public void actBefore(JoinPoint joinpoint) {
                //호출된 함수의 시그네처를 확인 후 저장
  String signature = joinpoint.getSignature().toShortString();
  System.out.println("captured before");
  this.saver.addAction(signature);
 }

 @After("execution(* com.example.aop.ActImpl.do*(..))")
 public void actAfter(JoinPoint joinpoint) {
 }
}

이 예제는 AOP 를 사용 시에 기존의 로그인 체크나 권한 체크 외에도 다양한 용도로 사용할 수 있다는 것을 확인 하고 싶어서 만든 예제이다.
횡단 관심사의 분리와 관점을 기준으로 상상력을 발휘할 수 있어야 하지 않을까 싶다.
 참고 : http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/

댓글 없음:

댓글 쓰기