스프링은 자동 프록시 생성기를 빈 후처리기로 자동 등록한다. 자동 프록시 생성기는 빈으로 등록된 Advisor 들을 확인해서 빈 객체를 프록시객체로 변경해 준다. 자동 프록시 생성기의 존재로 개발자는 Advisor 만 생성하여 스프링 빈으로 등록하면 된다.
이번 포스팅에서는 Advisor 를 쉽게 만들게 해주는 @Aspect 어노테이션에 대해 알아보자.
자동 프록시 생성기의 존재로 개발자는 Advisor 만 생성하면 된다고 하였다. @Asepect 는 어노테이션 방식으로 Advisor 를 편리하게 생성할 때 사용한다.
클래스에 @Aspect 를 추가한 뒤 내부 메서드로 Advisor를 생성한다. @Around 로 Pointcut 을 명시하고, execute 메서드 내부에 Advice 를 구현하면 끝이다. 그 후 Advisor 처럼 스프링 빈으로 등록하면 된다.
@Aspect 를 Advisor 로 변환하는 것은 누가 담당할까? 자동 프록시 생성기가 이를 담당한다. 즉 자동 프록시 생성기는 @Aspect 를 Advisor 로 변환하는 일과, Advisor 를 바탕으로 프록시객체를 생성하는 두가지 일을 수행한다.
스프링 어플리케이션 로딩 시점에 자동 프록시 생성기가 호출된다. 이 때 스프링 빈의 @Aspect 를 모두 조회하여 이를 바탕으로 Advisor 를 생성하고 @Asepect 어드바이저 빌더에 저장해 놓는다.
자동 프록시 생성기는 스프링 빈 객체를 컨테이너에 등록할 때, @Aspect 어드바이저 빌더의 Advisor 와 빈으로 등록된 Advisor 를 함께 조회하여 프록시객체를 생성한다.
즉 @Aspect 는 자동 프록시 생성기에 의해 Advisor 로 변환되어 빈으로 등록된 Advisor 와 똑같이 사용된다.
직접 Advisor 객체를 생성해 빈으로 등록해도 되지만. @Aspect 를 사용하면 어노테이션으로 매우 편리하게 Advisor 를 생성할 수 있다. Advisor 로의 변환은 자동 프록시 생성기가 담당한다.
이제 @Aspect 를 로그추적기에 적용해보자.
@Around 로 Pointcut 을 설정하고. execute 메서드 내부에 Advice 코드를 넣어주었다. ProceedingJoinPoint 는 Advice 의 MethodInvocation 과 동일하다. 실제객체, 호출된 실제 객체의 메서드 등의 정보를 갖고있다. joinPoint.proceed() 로 실제객체의 메서드를 호출한다.
@Aspect 객체를 수동으로 빈으로 등록하였다. 이제 자동 프록시 생성기가 내부의 메서드들을 Advisor 로 변경하여 사용할 것이다.
@Aspect 는 스프링에서 어노테이션 방식으로 Advisor 를 생성할 때 사용한다.
스프링 로딩 시점에 자동 프록시 생성기가 빈으로 등록된 @Aspect를 Advisor 로 변경하여 저장하며, Advisor 와 동일하게 사용한다.
실무에선 대부분 @Aspect 로 Advisor를 생성한다.