ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @Aspect 프록시
    스프링/스프링 AOP 2023. 9. 20. 12:57

    이전까지 만들었던 포인트컷과 어드바이스를 어노테이션 하나로 만들 수 있다.

     

    @Slf4j
    @Aspect
    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 {
            // 여기 advice 로직이 들어감
            TraceStatus status = null;
    
            try {
                String message = joinPoint.getSignature().toShortString();
                status = logTrace.begin(message);
    
                Object result = joinPoint.proceed(); // 실제 호출 대상(target)을 호출
    
                logTrace.end(status);
                return result;
            } catch (Exception e) {
                logTrace.exception(status, e);
                throw e;
            }
        }
    }

    클래스 선언부에 @Aspect라는 어노테이션을 붙여주면 자동으로 어드바이저를 만들어준다.

     

    execute() 메서드 위에 @Around라는 어노테이션이 있는데, 이 어노테이션이 포인트컷이며 메서드의 로직 부분이 advice인 것이다. 이 2개를 합쳐서 자동으로 어드바이저를 생성해준다.

     

     

     

    자동 프록시 생성기의 기능

    1. @Aspect를 보고 어드바이저로 변환해서 저장한다.

    2. 어드바이저를 기반으로 프록시를 생성한다.

     

     

     

    1. @Aspect를 어드바이저로 변환하는 과정

    사진 : 인프런 스프링 강의

    1. 스프링 애플리케이션 로딩 시점에 자동 프록시 생성기를 호출

    2. 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 어노테이션이 붙은 스프링 빈을 모두 조회

    3. @Aspect 어드바이저 빌더를 통해 @Aspect 어노테이션 정보를 기반으로 어드바이저 생성

    4. 생성한 어드바이저 @Aspect 어드바이즈 빌더 내부에 저장

     

    @Aspect 어드바이저 빌더란 @Aspect 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 보관하는 것을 담당한다.

     

     

     

     

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

    사진 : 인프런 스프링 강의

    1. 스프링 빈 대상이 되는 객체를 생성

    2. 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달

    3. 스프링 컨테이너와 @Aspect 어드바이저 빌더 내부에 저장된 어드바이저들을 전부 조회

    4. 포인트컷을 사용해서 어느 객체에 프록시를 적용할지 판단한다.

    5. 프록시 적용 대상이면 프록시 생성 후 프록시 반환, 아니라면 원본 객체를 스프링 빈으로 등록

    6. 반환된 객체를 최종적으로 스프링 빈으로 등록

     

     

     

    결론

    @Aspect를 사용하면 프록시를 매우 편리하게 적용할 수 있다.

    '스프링 > 스프링 AOP' 카테고리의 다른 글

    어드바이스 순서  (0) 2023.09.22
    @Pointcut - 포인트컷 분리  (0) 2023.09.22
    빈 후처리기  (0) 2023.09.17
    어드바이저의 실제 적용  (0) 2023.09.17
    여러 어드바이저 동시 적용  (0) 2023.09.17
Designed by Tistory.