Spring/Spring

[Spring] @Aspect 정리

Jemlog 2022. 2. 26. 01:08

📌 김영한님의 강의를 바탕으로 정리한 글입니다.

 

 

[ @Aspect란? ]  


스프링 어플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성된 어드바이저를 스프링 빈으로 등록해야 한다. 자동 프록시 생성기는 스프링 컨테이너에서 어드바이저를 찾아서 나머지 스프링 빈들에 프록시를 자동으로 적용해준다.

 

스프링은 @Aspect 라는 어노테이션을 사용해서 어드바이져를 쉽게 만들수 있게 해준다. @Aspect는 AspectJ 프로젝트에서 제공해주는 어노테이션이다. 하지만 AspectJ 프로젝트 자체를 사용하는것은 아니다. 스프링은

AspectJ의 기능을 차용해서 사용하는 것이다.

 

@Aspect를 사용하는 방법을 살펴보자 

@Component
@Aspect // 해당 클래스를 어드바이져로 만들 수 있게 해준다. 
@Slf4j
public class LogAspect {

    @Around("execution(* hello.myaopstudy.controller.AopController.*(..))") // 포인트컷 지시자 
    public Object logTest(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("로깅 시작");
        Object result = joinPoint.proceed();  // 실제 메서드 호출
        return result;

    }

}

 

@Aspect 클래스를 스프링 어플리케이션에서 사용하기 위해선 스프링 빈으로 꼭 등록해줘야 한다.

@Bean이나 @Component로 등록해주자.

 

 

 

[ @Aspect를 사용한 프록시의 생성 및 동작 순서 ]  


@Aspect 어노테이션이 스프링 어플리케이션에서 어떻게 사용되는지 순서대로 차근차근 알아보자.

 

@Aspect를 통해 어드바이져를 생성하는 순서

1. 스프링 어플리케이션이 실행되면서 자동 프록시 생성기를 호출한다.
2. 자동 프록시 생성기가 스프링 컨테이너에 등록된 @Aspect 스프링 빈을 모두 찾아낸다.
중요) 스프링 빈들이 등록되기 전에 어드바이져나 @Aspect 빈들이 미리 스프링 컨테이너에 등록된다.
3. 자동 프록시 생성기는 @Aspect 어드바이저 빌더를 통해 @Aspect가 붙은 클래스에서 포인트컷 정보와 어드바이스 정보를 추출해서 어드바이져를 생성한다.
4. 생성된 어드바이져는 @Aspect 어드바이저 빌더 내부에 캐시한다. 캐시에 이미 어드바이저가 만들어져 있다면 캐시에 저장된 어드바이저를 반환한다.

 

@Aspect를 통해 프록시를 생성하는 방법

1. 객체들이 생성된 후 스프링 컨테이너에 등록되기 직전에 자동 프록시 생성기(빈 후처리기)에서 낚아챈다.
2. 자동 프록시 생성기에서 스프링 컨테이너 내부의 어드바이저를 모두 호출한다.
3. 자동 프록시 생성기에서 @Aspect 어드바이져 빌더 내부의 어드바이저를 모두 호출한다.
4. 등록 예정인 객체의 클래스 메타정보, 메서드 정보 하나하나를 어드바이저와 대조한다. 조건이 하나라도 일치한다면 프록시를 생성해서 스프링 컨테이너에 등록한다.

 

@Aspect는 실무에서 매우 자주 사용되는 방법이다. 보통 로그를 남기거나 트랜젝션을 실행하는데 AOP가 많이 사용된다. 핵심 비즈니스 로직과 달리, 위의 두 기능은 부가 기능이자 애플리케이션의 여러 기능에 사용될 수 있는 공통 관심사이다. 이를 다른 말로 횡단 관심사라고 한다. 

 

 

 

Reference