반응형
https://jainkku.tistory.com/98
Spring AOP
장점
- 컴파일러나 클래스 로더 조작기를 설정하지 않아도 됨
주의사항
- 프록시는 메서드 오버라이딩 개념으로 동작하기 때문에, Spring AOP는 메서드 실행 시점에만 AOP를 적용할 수 있음
- 반면에 AspectJ는 모든 지점에 AOP를 적용할 수 있다.
- Spring AOP는 Spring 컨테이너가 관리할 수 있는 빈에만 AOP를 적용할 수 있음
그렇다면 AOP 구현 시 Spring AOP 보다 기능이 많은 AspectJ를 직접 사용하는게 더 좋지 않을까?
위와 같이 생각했지만, 실무에서는 Spring이 제공하는 AOP 기능만 사용해도 대부분의 문제를 해결할 수 있다고 한다.
또한 AspectJ를 사용하려면 추가로 공부할 내용과 설정이 복잡하지만, Spring AOP는 별도의 추가 자바 설정 없이 편리하게 사용할 수 있다는 장점이 있다.
Spring AOP 사용 예제
1. 먼저 원하는 대상 객체를 빈에 등록한다.
Spring AOP는 Spring 컨테이너가 관리할 수 있는 빈에만 AOP를 적용할 수 있기 때문에 Component 애너테이션을 사용해 빈에 등록한다.
@Component
public class BasicCalculator implements Calculator {
@Override
public long factorial(final long num) {
long result = 1;
for (long i = 1; i <= num; i++) {
result *= i;
}
return result;
}
}
2. Aspect를 정의한다
- 클래스 상단에 Aspect 애너테이션을 붙인다
- Aspect 또한 빈으로 등록한다
- Pointcut을 정의한다
- Advice를 정의하고, Pointcut을 정의할 때 사용한 시그니처를 포함한다
- 내부에서 핵심기능인 Target을 호출하기 전후에 실행시간을 측정하는 로직을 작성한다
@Component
@Aspect
public class ExecutionTimeAspect {
@Pointcut("execution(* fact*(..))")
private void publicTarget() {}
@Around("publicTarget()")
public Object measure(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.nanoTime();
try {
// 핵심 기능인 Target 호출
Object result = joinPoint.proceed();
return result;
} finally {
long finish = System.nanoTime();
Signature sig = joinPoint.getSignature();
System.out.printf("%s.%s(%s) 실행 시간 : %d \n",
joinPoint.getTarget().getClass().getSimpleName(),
sig.getName(),
Arrays.toString(joinPoint.getArgs()),
(finish - start)
);
}
}
}
3. 실행 결과
reference
- https://velog.io/@seungju0000/%EC%8A%A4%ED%94%84%EB%A7%81-AOP-%EA%B0%9C%EB%85%90
반응형