Spring

[SpringBoot] @Aspect 어노테이션

꾸준함. 2021. 12. 23. 23:41

개요

기존에 빈 후처리기에 대해서 알아봤으며 gradle 혹은 pom.xml에 'org.springframework.boot:spring-boot-starter-aop' 라이브러리를 추가하면 AnnotationAwareAspectJAutoProxyCreator라는 자동 프록시 생성기가 스프링 빈에 자동으로 등록이 된다는 것을 배웠습니다. (https://jaimemin.tistory.com/2028)

자동 프록시 생성기는 스프링 빈으로 등록된 Advisor들을 찾고, Pointcut에 매칭이 될 경우 자동으로 프록시를 적용해줍니다.

@Aspect 어노테이션은 편리하게 Advisor 생성 기능을 지원하는데 이번 게시글에서는 @Aspect에 대해서 간단히 알아보겠습니다.

 

1. @Aspect 프록시 예시

@Aspect는 AOP를 가능하게 하는 AspectJ 프로젝트에서 제공하는 어노테이션입니다.

따라서 기존 게시글에서 AspectJExpressionPointcut을 적용한 코드와 유사한 형태를 띱니다.

 

1.1 AspectJExpressionPointcut을 적용한 Config


 

1.2 @Aspect을 적용한 Config 및 Aspect


 

2. @Aspect 설명

개요에서도 말했듯이 자동 프록시 생성기는 Advisor를 찾아서 프록시를 생성하고 빈에 적용하는 역할을 수행합니다.

자동 프록시 생성기는 또 다른 역할이 있는데 바로 @Aspect 어노테이션을 찾아서 해당 클래스를 Advisor(Pointcut + Advice)로 만들어줍니다.

정리를 하자면 자동 프록시 생성기는 프록시를 생성하고 적용하는 역할 뿐만 아니라 @Aspect를 Advisor로 변환해서 저장하는 기능도 수행합니다.

 

2.1 @Aspect를 Advisor 변환하는 과정

  • 스프링 애플리케이션 로딩 시점에 자동 프록시 생성기 호출
  • 자동 프록시 생성기가 스프링 컨테이너 내 @Aspect 어노테이션 붙은 스프링 빈 모두 조회
  • @Aspect 어드바이저 빌더를 통해 Advisor 생성
  • 생성한 Advisor를 @Aspect 어드바이저 빌더 내부에 저장

* @Aspect 어드바이저 빌더는 BeanFactoryAspectJAdvisorsBuilder 클래스 (@Aspect의 정보를 기반으로 Pointcut, Advice, Advisor를 생성하고 보관하는 것을 담당)

 

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

  • 스프링 빈 대상이 되는 객체 생성
  • 생성된 객체를 빈 저장소에 등록하기 전 빈 후처리기에 전달
  • 스프링 컨테이너 내 Advisor 빈 모두 조회
  • @Aspect 어드바이저 빌더 내부에 저장된 Advisor 모두 조회
  • 조회된 Advisor 내 Pointcut을 통해 프록시 적용 대상 확인
    • 객체의 클래스 정보와 메서드를 Pointcut에 모두 매칭 한 뒤 조건이 하나라도 만족하면 프록시 적용 대상
  • 프록시 적용 대상이라면 프록시 생성 후 프록시 반환
    • 프록시 적용 대상이 아니라면 원본 객체를 반환 해 원본 객체를 스프링 빈에 등록
    • 프록시 적용 대상이라면 원본 객체가 아닌 프록시를 스프링 빈으로 등록

악필 ㅈㅅ

 

참고

인프런 스프링 핵심 원리 - 고급편 (김영한 강사님)

반응형