본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

AOP 구현 : @Aspect 어노테이션 사용






@Aspect 어노테이션을 이용해서 공통으로 적용할 기능을 구현한 경우, XML 설정에서 이를 인식할 수 있도록 

<aop:aspectj-autoproxy/> 태그를 추가해주어야 한다.

    <aop:aspectj-autoproxy />
    <beans:bean id="exeTimeAspect" class="com.ktko.aop.ExeTimeAspect" />


@Aspect 어노테이션을 이용해서 공통 기능을 제공하는 Aspect 클래스를 작성할 수도 있다. @Aspect 어노테이션을 이용한 공통 기능 구현 방법은 POjo 방식과 크게 다르지 않다. 차이점이 있다면, @Aspect 어노테이션을 적용한 클래스에 공통 기능과 PointCut을 설정한다는 점이다.

package com.ktko.aop;

import java.util.Arrays;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

//Aspect 역할을 할 클래스를 선언하기 위해 어노테이션 선언
@Aspect
public class ExeTimeAspect {
    
    //PointCut의 속성에 핵심코드의 어느 부분까지 공통 기능을 사용하겟다고 명시
    @Pointcut("expression=within(com.ktko.test.*)")
    private void publicTarget() {
        
    }
    
    //around가 적용될 포인트 컷을 명시 : publicTarget()
    @Around("publicTarget()")
    public Object measure(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.nanoTime();
        try {
            Object result = joinPoint.proceed();
            return result;
        } finally {
            long finish = System.nanoTime();
            Signature sig = joinPoint.getSignature();
            System.out.printf("%s.%s(%s) 실행 시간 : %d ns\n", joinPoint.getTarget().getClass().
            getSimpleName(), sig.getName(), Arrays.toString(joinPoint.getArgs()), (finish - start));
            System.out.println(joinPoint.getTarget().getClass().getSimpleName());
            System.out.println(sig.getName());
            System.out.println(Arrays.toString(joinPoint.getArgs()));
        }
    }
}


XML 스키마 방식으로 구현했던 것과 차이점은

클래스에 @Aspect 어노테이션 적용

@Pointcut 어노테이션을 적용하여 PointCut을설정했다.

@Around  어노테이션을 적용해서 메서드가 Around Advice로 사용된다고 설정햇다.


즉 @Aspect 어노테이션을 적용한 클래스는 PointCut과 Advice 설정 그리고 Aspect 구현을 함께 제공한다. measure 메서드는 Aspect가 제공할 공통 기능의 구현에 해당한다. 이 공통 기능을 언제 어디에 적용할지 여부는 메서드에 붙은 @Around 어노테이션을 사용하여 설정하고 있다.


예제 코드

AOPTest.zip