프록시란?
핵심 기능은 다른 객체에 위임하고 부가적인 기능을 하는 객체
Aspect Oriented Programming
여러 객체에 공통으로 적용될 기능을 분리하는 프로그래밍 기법
기능을 두가지로 나누었을 때
Spring에서는 핵심 기능을 할 인터페이스와 이를 받아 공통기능을 하는 클래스를 따로 구현하지 않고 공통 기능을 할 클래스만 구현하면 됨
용어 | 의미 |
---|---|
Advice | 언제 공통 기능을 핵심 로직에 적용할 지를 정의 |
Joinpoint | Advice를 적용하능한 지점 ex) 메서드 호출, 필드 값 변경 |
Pointcut | 실제 Advice가 적용되는 Joinpoint |
Weaving | Advice를 핵심 로직 코드에 적용하는것 |
Aspect | 여러 객체에 공통적으로 적용되는 기능 |
Before Advice | 메서드 호출 전 공통기능 실행 |
After Returning Advice | 익셉션 없이 실행된 이후 |
After Throwing Advice | 메서드 실행 도중 익셉션 발생한 경우에 공통기능 실행 |
After Advice | 익셉션 상관없이 대상 객체 메서드 실행후 실행 |
Around Advice | 실행 전 후 익셉션 발생 시점에 공통기능 실행 |
package AOP;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.Signature;
@Aspect // 공통 기능을 사용할 클래스
public class ExeTimeAspect {
@Pointcut("execution(public * AOP..*(..))") // 공통 기능을 적용할 Pointcut
private void publicTarget(){
}
@Around("publicTarget()") // Around Advice 설정
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);
}
}
}