ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링 핵심 원리 - @Aspect AOP
    Study/Spring 2025. 4. 22. 23:33

    @Aspect 프록시 - 적용

    • 스프링은 @Aspect 어노테이션으로 Pointcut과 Advice로 구성되어 있는 Advisor 생성 기능을 지원

     

    예시)

    더보기
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    
    @Slf4j
    @Aspect
    public class LogTraceAspect {
    
        private final LogTrace logTrace;
    
        public LogTraceAspect(LogTrace logTrace) {
            this.logTrace = logTrace;
        }
    
        @Around("execution(* com.example.demo.proxy..*(..))")
        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 : 어노테이션 기반 프록시를 적용할 때 필요함
    • @Around(...)
      • @Around의 값에 Pointcut 표현식을 넣음 (표현식은 AspectJ 표현식을 사용함)
      • @Around의 메서드는 Advice가 됨
    • ProceedingJoinPoint joinPoint : Advice에서 살펴본 `MethodInvocation methodInvocation`과 유사한 기능임
      • 내부에 실제 호출 대상, 전달 인자, 어떤 객체와 어떤 메서드가 호출되었는지 정보가 포함되어 있음
    • joinPoint.proceed() : 실제 호출 대상(target)을 호출함
    • @Aspect가 있어도 스프링 빈으로 등록해줘야 함

     

    @Aspect 프록시 - 설명

    • 스프링의 자동 프록시 생성기(AnnotationAwareAspectJAutoProxyCreator)는 2가지 역할을 수행
      1. @Aspect를 보고 Advisor(Pointcut + Advice)로 변환해서 저장한다.
      2. Advisor를 기반으로 프록시를 생성한다.

     

    1) @Aspect를 Advisor로 변환해서 저장하는 과정

    1. 실행 : 스프링 어플리케이션 로딩 시점에 자동 프록시 생성기를 호출한다.
    2. 모든 @Aspect 빈 조회 : 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 어노테이션이 붙은 스프링 빈을 모두 조회한다.
    3. Advisor 생성 : @Aspect Advisor Builder를 통해 @Aspect 어노테이션 정보를 기반으로 Advisor를 생성한다.
    4. @Aspect 기반 Advisor 저장 : 생성한 Advisor를 @Aspect Advisor Builder 내부에 저장한다.

     

    추가) @Aspect Advisor Builder

    더보기
    • BeanFactoryAspectJAdvisorsBuilder 클래스
    • @Aspect의 정보를 기반으로 Pointcut, Advice, Advisor를 생성하고 보관하는 것을 담당
    • @Aspect의 정보를 기반으로 Advisor를 만들고, @Aspect Advisor Builder 내부 저장소에 캐시
    • 캐시에 Advisor가 이미 만들어져 있는 경우 캐시에 저장된 Advisor를 반환함

     

    2) Advisor를 기반으로 프록시 생성

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

    1. 생성 : 스프링 빈 대상이 되는 객체를 생성함 (@Bean, 컴포넌트 스캔 모두 포함)
    2. 전달 : 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달함 (여기서는 스프링의 자동 프록시 생성기에 전달됨)
    3. Advisor 조회
      1. Advisor 빈 조회 : 스프링 컨테이너에서 Advisor 빈을 모두 조회함
      2. @Aspect Advisor 조회 : @Aspect Advisor Builder 내부에 저장된 Advisor를 모두 조회함
    4. 프록시 적용 대상 체크
      • 3-1, 3-2에서 조회한 Advisor에 포함되어 있는 Pointcut을 사용해서 해당 객체가 프록시를 적용할 대상인지 판단함
      • 이때 객체의 클래스 정보는 물론이고, 해당 객체의 모든 메서드를 Pointcut에 하나하나 모두 매칭해봄
      • 조건이 하나라도 만족하면 프록시 적용 대상이 됨 (메서드 하나만 Pointcut 조건에 만족해도 프록시 적용 대상이 됨)
    5. 프록시 생성
      • 프록시 적용 대상이면 프록시를 생성하고 프록시를 반환하고 해당 프록시를 스프링 빈으로 등록함
      • 프록시 적용 대상이 아니라면 원본 객체를 반환해서 원본 객체를 스프링 빈으로 등록함
    6. 빈 등록 : 반환된 객체는 스프링 빈으로 등록됨

     

    참고

    댓글

Designed by Tistory.