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

AOP 구현 : XML 스키마 기반



Aspect 구현하기

XML 스키마를 이용할 경우, XML 설정을 이용해서 Aspect를 어디에 적용할지를 설정한다. XML 설정에서 사용할 Aspect 구현 클래스는 일반 자바 클래스이며 아래에 코드를 올렸다.

package com.ktko.aop;

import java.util.Arrays;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;

public class ExeTimeAspect {
        
    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));

} } }

ProceedingJoinPoint 타입의 파라미터는 대상 객체의 메서드를 호출할 때 사용된다.실제 대상 객체의 메서드를 호출할 때에는 13행의 코드처럼 proceed() 메서드를 사용한다. 이 메서드를 호출하면 대상 객체의 메서드가 실행되므로, 이 코드의 이전과 이후의 공통 기능을 위한 코드를 위치시키면 된다. 

getSignature(), getTarget(), getArgs() 등의 메서드는 각각 메서드 시그니처, 대상 객체, 인자 목록을 구하는데 사용된다.


XML 스키마 설정하기


네임스페이스에서 AOP를 추가

<beans:bean id="exeTimeAspect" class="com.ktko.aop.ExeTimeAspect" /> <!-- AOP 설정 시작 --> <aop:config> <!-- Aspect의 ID를 지정하고 AOP공통 기능을 Bean으로 등록햇던 exeTimeAspect를 참조. --> <aop:aspect id="measureAspect" ref="exeTimeAspect"> <!-- pointcut의 ID는 publicmethod 이고, com.ktko.test.* 패키지에 있는 모든 클래스에 공통 기능을 적용. --> <aop:pointcut id="publicMethod" expression="within(com.ktko.test.*)"/> <!-- com.ktko.aop.ExeTimeAspect 클래스에 measure라는 공통기능 메소드를 publicMethod라는 pointcut에 적용. --> <aop:around pointcut-ref="publicMethod" method="measure"/> </aop:aspect> </aop:config>


예제 소스

Main

Calculator impeCal = new ImmpeCalculator(); System.out.println(impeCal.factorial(5)); Calculator recCal = new RecCaculator(); System.out.println(recCal.factorial(5));


package com.ktko.calculate;

public interface Calculator {
    
    public long factorial(long num);
}


package com.ktko.calculate;

public class ImmpeCalculator implements Calculator{

    @Override
    public long factorial(long num) {
        long result = 1;
        
        for(int i = 1; i <= num; i++) {
            result *= i;
        }
        
        return result;
    }

}


package com.ktko.calculate;

public class RecCaculator implements Calculator{

    @Override
    public long factorial(long num) {
        if(num == 0) {
            return 1;
        } else {
            return num * factorial(num - 1);
        }
    }

}


실행 결과



샘플 코드

AOPTest.zip