지난 포스팅까지 스프링에서 지원하는 빈 후처리기를 이용해 어드바이저만 등록하면 자동 프록시 생성기가 프록시를 자동으로 생성해 빈으로 등록해주었다. 그런데 @Aspect를 이용하면 편리하게 어드바이저를 생성할 수 있다.
@Aspect는 AspectJ 프로젝트에서 지원하는 어노테이션이다.
코드로 확인해보자.
@Slf4j
// 어노테이션 기반 프록시 적용
@Aspect
public class LogTraceAspect {
private final LogTrace logTrace;
public LogTraceAspect(LogTrace logTrace) {
this.logTrace = logTrace;
}
/*
* @Around : 포인트컷
* */
@Around("execution(* hello.proxy.app..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
TraceStatus status = null;
try {
String message = joinPoint.getSignature().toShortString();
status = logTrace.begin(message);
// 로직 호출
Object result = joinPoint.proceed();
logTrace.end(status);
return result;
} catch (Exception e) {
logTrace.exception(status, e);
throw e;
}
}
}
@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class AopConfig {
@Bean
public LogTraceAspect logTraceAspect(LogTrace logTrace) {
return new LogTraceAspect(logTrace);
}
}
1. 스프링 어플리케이션 로딩 시점에 자동 프록시 생성기 호출
2. 컨테이너에서 @Aspect가 붙은 스프링 빈을 조회
3. @Aspect 어드바이저 빌더를 통해 어드바이저 생성
4. 어드바이저를 @Aspect 어드바이저 빌더 내부에 저장
BeanFactoryAspectJAdvisorsBuilder를 말한다.
@Aspect의 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 보관하는 것을 담당한다.
@Aspect를 기반으로 어드바이저를 만들고, @Aspect 어드바이저 빌더 내부 저장소에 캐시한다.
캐시에 어드바이저가 만들어져 있는 경우 캐시에 저장된 어드바이저를 반환한다.
이번 포스팅에서는 @Aspect를 이용한 어드바이저 생성 방법에 대해서 알아보았다.
@Aspect를 이용하면 어드바이저를 편리하게 생성할 수 있다.
@Aspect를 사용하면 스프링에서 해당 어노테이션이 붙은 스프링 빈을 조회한 후, @Aspect 어드바이저 빌더를 통해 어드바이저를 생성하고, 이를 @Aspect 어드바이저 빌더 내부에 저장한다.
이후에 빈 후처리기에서 스프링 컨테이너에 등록된 어드바이저 빈과 @Aspect 어드바이저 빌더에 저장된 어드바이저를 조회해 프록시를 생성하고 반환한다.
이런 과정의 예시로 로그 추적기를 들었는데, 로그 추적기는 AOP로 봤을 때 부가기능이 된다. 이때 로그추적기는 타겟이 되는 여러 기능에 걸쳐 들어가는 관심사인데, 이처럼 여러곳에 걸쳐있는 것을 바로 횡단 관심사이다.
다음 포스팅에서는 AOP에 대해 알아보도록 하자.
출처 : 김영한 - 스프링 핵심 원리 고급편