TIL

@Aspect AOP

@Aspect 프록시 - 코드

참고: @Aspect는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다. 스프링은 이것을 차용해서 프록시를 통한 AOP를 가능하게 한다.

@Aspect
@Component
public class LogTraceAspect {

    private final LogTrace logTrace;

    public LogTraceAspect(LogTrace logTrace) {
        this.logTrace = logTrace;
    }

    @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;
        }
    }
}

@Aspect 프록시 - 설명

@Aspect를 어드바이저로 변환, 저장하는 과정

  1. 실행: 스프링 로딩 시점에 자동 프록시 생성기 호출
  2. 모든 @Aspect 빈 조회
  3. 어드바이저 생성: @Aspect 어드바이저 빌더를 통해 @Aspect 정보를 기반으로 어드바이저 생성
  4. 어드바이저 저장: 생성한 어드바이저를 @Aspect 어드바이저 빌더 내부에 저장
    • BeanFactoryAspectJAdvisorBuilder
    • @Aspect 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 보관한다.

어드바이저 기반으로 프록시 생성

img.png

  1. 생성: 스프링 빈 대상이 되는 객체를 생성
  2. 전달: 빈들을 후 처리기(자동 프록시 생성기)에 전달
  3. Advisor 빈 조회: 스프링 컨테이너에서 Advisor 빈을 모두 조회
  4. **@Aspect Advisor 조회**: @Aspect 어드바이저 빌더 내부의 Advisor를 모두 조회
  5. 프록시 적용 대상 체크: 조회한 Advisor에 포함되어 있는 포인트컷으로 빈이 프록시 적용 대상인지 아닌지 판단한다.
  6. 프록시 생성: 프록시 적용 대상 빈의 프록시를 생성하고 반환한다. 적용 대상이 아니면 원본 객체를 반환한다.
  7. 빈 등록: 반환된 객체는 스프링 빈으로 등록된다.