프록시 - @Aspect

바그다드·2023년 9월 9일
0

지난 포스팅까지 스프링에서 지원하는 빈 후처리기를 이용해 어드바이저만 등록하면 자동 프록시 생성기가 프록시를 자동으로 생성해 빈으로 등록해주었다. 그런데 @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;
        }
    }
}
  • execution( hello.proxy.app..(..))
    AspectJ의 표현식이다.
  • @Around는 포인트컷
  • 메서드는 어드바이스가 된다.
  • ProceedingJoinPoint
    어드바이스의 MethodInvocation처럼 실제 호출 대상, 파라미터, 호출 객체와 메서드 정보를 포함하고 있다.
  • joinPoint.proceed()
    타켓을 호출한다.
  • @Aspect는 @Component를 포함하지 않고 있어, @Bean이나 @Component를 이용해 스프링 빈으로 등록해줘야 한다.

Config 생성

@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class AopConfig {

    @Bean
    public LogTraceAspect logTraceAspect(LogTrace logTrace) {
        return new LogTraceAspect(logTrace);
    }
}
  • @Aspect를 빈으로 등록

@Aspect -> 어드바이저 변환 과정


1. 스프링 어플리케이션 로딩 시점에 자동 프록시 생성기 호출
2. 컨테이너에서 @Aspect가 붙은 스프링 빈을 조회
3. @Aspect 어드바이저 빌더를 통해 어드바이저 생성
4. 어드바이저를 @Aspect 어드바이저 빌더 내부에 저장

@Aspect 어드바이저 빌더

BeanFactoryAspectJAdvisorsBuilder를 말한다.
@Aspect의 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 보관하는 것을 담당한다.
@Aspect를 기반으로 어드바이저를 만들고, @Aspect 어드바이저 빌더 내부 저장소에 캐시한다.
캐시에 어드바이저가 만들어져 있는 경우 캐시에 저장된 어드바이저를 반환한다.

자동 프록시 생성기 작동 과정

  1. 스프링 빈 객체 생성
  2. 빈 후처리기에 전달
  3. Advisor 빈을 조회
    3-1. 스프링 컨테이너에서 Advisor 빈 조회
    3-2. @Aspect 어드바이저 빌더 내부의 어드바이저를 모두 조회
  4. 프록시 적용 대상 체크
  5. 프록시 생성
  6. 프록시를 컨테이너에 등록

정리

이번 포스팅에서는 @Aspect를 이용한 어드바이저 생성 방법에 대해서 알아보았다.

@Aspect를 이용하면 어드바이저를 편리하게 생성할 수 있다.
@Aspect를 사용하면 스프링에서 해당 어노테이션이 붙은 스프링 빈을 조회한 후, @Aspect 어드바이저 빌더를 통해 어드바이저를 생성하고, 이를 @Aspect 어드바이저 빌더 내부에 저장한다.

이후에 빈 후처리기에서 스프링 컨테이너에 등록된 어드바이저 빈과 @Aspect 어드바이저 빌더에 저장된 어드바이저를 조회해 프록시를 생성하고 반환한다.

이런 과정의 예시로 로그 추적기를 들었는데, 로그 추적기는 AOP로 봤을 때 부가기능이 된다. 이때 로그추적기는 타겟이 되는 여러 기능에 걸쳐 들어가는 관심사인데, 이처럼 여러곳에 걸쳐있는 것을 바로 횡단 관심사이다.

다음 포스팅에서는 AOP에 대해 알아보도록 하자.

출처 : 김영한 - 스프링 핵심 원리 고급편

profile
꾸준히 하자!

0개의 댓글