토비의 스프링에서 아래의 문장을 읽었습니다.
AOP 기술의 원조이자, 가장 강력한 AOP 프레임워크로 꼽히는 AspectJ는 프록시를 사용하지 않는 대표적인 AOP 기술이다. - p.506, 토비의 스프링 3.1 Vol.1
AspectJ에 대해 검색해봤고, 어떤 블로그에서는 AspectJ가 프록시 방식으로 동작한다고 설명하고 있었습니다.
좀더 찾아보기 전에 ChatGPT에게도 물어봤습니다.
...?
아래의 두 문서를 읽고 의문이 해결됐습니다.
https://velog.io/@suhongkim98/Intro-To-AspectJ
https://www.baeldung.com/aspectj
먼저 AOP의 핵심 용어인 타깃, 어드바이스, 조인포인트, 포인트컷, 그리고 애스팩트에 더하여
위빙(weaving)이 뭔지 알아야합니다.
위빙은 애스펙트를 객체에 적용하는 작업을 의미합니다.
AspectJ는 Compile-time 위빙, Post-compile 위빙, Load-time 위빙 방식을 선택적으로 사용할 수 있습니다.
해당 위빙 방식들은 프록시 대신에, AspectJ Compiler를 사용해 타깃의 클래스파일을 수정하거나, 타깃이 JVM에 로드될 때 바이트코드를 조작하는 방법을 사용합니다.
그러나 스프링에서 AspectJ를 사용할 경우에 AspectJ의 세 위빙 방식 대신 스프링 AOP의 위빙 방식인 Runtime 위빙을 사용하게 됩니다.
이렇게되면 스프링 AOP는 프록시를 사용하기 때문에, AspectJ를 사용해도 프록시를 사용하게 되는 결과가 된다고 합니다.
추가적으로, 스프링 AOP의 위빙은 AspectJ의 위빙보다 성능이 뒤쳐지기 때문에, AspectJ의 위빙을 사용하는 방식으로 바꿔주면 좋습니다.
https://gmoon92.github.io/spring/aop/2019/05/24/aspectj-of-spring.html
위 블로그에서 스프링 AOP를 AspectJ AOP로 변경하는 이유와 변경하는 방법에 대해 코드와 함께 매우 자세히 설명해주셨습니다.
아래는 AspectJ의 공식 문서입니다.
https://eclipse.dev/aspectj/doc/released/devguide/index.html
끝.
정보에 감사드립니다.