다음을 꼭 추가해줘야 한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop' //추가
}
이 라이브러리를 추가하면 aspectjweaver
라는 aspectJ
관련 라이브러리를 등록하고, 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다.
스프링 부트가 없던 시절에는 @EnableAspectJAutoProxy
를 직접 사용해야 했는데, 이 부분을 스프링 부트가 자동으로 처리해준다. aspectJ
는 뒤에서 설명.
스프링 부트가 활성화하는 빈은 AopAutoConfiguration
를 참고하자.
자동 프록시 생성기
AnnotationAwareAspectJAutoProxyCreator
라는 빈 후처리기가 스프링 빈에 자동으로 등록된다.Advisor
들을 자동으로 찾아서 프록시가 필요한 곳에 자동으로 프록시를 적용해준다.Advisor
안에는 Pointcut
과 Advice
가 이미 모두 포함되어 있다. 따라서 Advisor
만 알고 있으면 그 안에 있는 Pointcut
으로 어떤 스프링 빈에 프록시를 적용해야 할지 알 수 있다. 그리고 Advice
로 부가 기능을 적용하면 된다.참고로 AnnotationAwareAspectJAutoProxyCreator
는 @AspectJ
와 관련된 AOP 기능도 자동으로 처리해준다. 자세한 내용은 뒤에.
@Bean
, 컴포넌트 스캔 모두 포함)Advisor
를 조회한다.Advisor
에 포함되어 있는 포인트컷
을 사용해서 해당 객체가 프록시를 적용할 대상인지 아닌지 판단한다. 이때 객체의 클래스 정보는 물론이고, 해당 객체의 모든 메서드를 포인트컷
에 하나하나 모두 매칭해본다. 그래서 조건이 하나라도 만족하면 프록시 적용 대상이 된다. 예를 들어서 10개의 메서드 중에 하나만 포인트컷 조건에 만족해도 프록시 적용 대상이 된다.1. 프록시 적용 여부 판단 - 생성 단계
2. 어드바이스 적용 여부 판단 - 사용 단계
orderControllerV1
의 request()
는 조건에 만족하므로 프록시는 어드바이스를 먼저 호출하고 target
을 호출orderControllerV1
의 noLog()
는 조건에 만족하지 않으므로 target
만 호출참고
프록시를 모든 곳에 생성하는 것은 비용 낭비이다.
그래서 자동 프록시 생성기는 모든 스프링 빈에 프록시를 적용하는 것이 아니라 프인트컷으로 한번 필터링해서 어드바이스가 사용될 가능성이 있는곳에만 생성
먼가 이상한 곳에 로그가 출력되고 있다.
그 이유는 메서드중에 request
가 포함된다던지 여러 이유로 조건에 맞는 애들이 모두 등록되었기 때문이다.
즉, 포인트컷이 단순히 메서드로만 조건을 걸어서 그렇다.
그러므로 정밀한 포인트컷이 필요하다.
AspectJExpressionPointcut
실무에서는 이거만 쓴다.
AspectJ
라는 AOP에 특화된 포인트컷 표현식을 적용할 수 있다. AspectJ
포인트컷 표현식과 AOp는 조금 뒤에 설명스
지금은 특별한 표현식으로 복잡한거 만들수 있다고 생각스
AsepectJExpressionPointcut
: AspectJ
포인트컷 표현식을 적용할 수 있다.
execution(* hello.proxy.app..*(..))
: AspectJ
가 제공하는 포인트컷 표현식이다. 이후에 자세히 설명하고 지금은 간단히
*
: 모든 반환 타입hello.proxy.app..
: 해당 패키지와 그 하위 패키지*(..)
: *
모든 메서드 이름, (..)
파라미터는 상관없음쉽게 이야기해서 hello.proxy.app
패키지와 그 하위 패키지의 모든 메서드는 포인트컷의 매칭 대상이 된다.
근데 이렇게 실행하면 no-log
도 출력이 된다.
이렇게 하면 no-log
는 적용이 안되도록 설정이 가능하다.
이건 또 &&
를 이용한 조합식이 된다.(or
는 ||
자세한건 뒤에서)
요약하자면, advisor1
, advisor2
이렇게 2개가 있을때,
advisor1
의 포인트컷만 만족 -> 프록시 1개
advisor1
, advisor2
포인트컷 모두 만족 -> 프록시 1개
어느 것도 만족 X -> 프록시 X
즉, advisor
를 아무리 많이 만들어도 프록시는 1개이다.
실무에서는 매 advisor
마다 하나의 프록시를 생성하는 것으로 알고 있는 사람이 많다고 함.