Spring의 AOP는 부가 기능을 핵심 기능으로부터 분리하고 접근을 제어하기 위해 등장한 기술이다.
Proxy 객체를 통해 객체를 사용하게 되면 아래와 같은 장점이 있다.
다만 이런 프록시 방식은 본래 객체와 프록시 객체의 빈이 같이 등록되어있어야 한다는 점과 순환 참조 발생 가능성이 있다.
그에 따라 스프링에선 아래와 같은 방식으로 AOP를 제공한다
Java에서 제공하는 자동 프록시 생성기를 통해 직접 프록시 객체를 생성한 후에 처리해주는 것.
Reflection을 통해 프록시를 생성하기 때문에 성능 오버헤드가 있다.
또한 프록시를 생성할 때, 인터페이스를 기반으로 생성하기 때문에 인터페이스를 구현한 클래스가 아니면 프록시 객체를 생성할 수 없다.
JDK Dynamic proxy 방식에선 클래스 구현체가 인터페이스를 상속하지 않았을 경우 프록시 객체를 생성할 수 없었으며, 이 문제를 해결하기 위해선 프록시 객체가 클래스 구현체를 상속할 수 있어야 한다.
그에 따라 Spring에서는 CGLib라는 바이트 조작 라이브러리를 통해 클래스 상속으로 프록시를 구현한다.
다만 CGLib 프록시는 상속을 이용하므로, 기본 생성자를 필요로 하며 생성자가 2번 호출되고 final 클래스/메소드를 사용할 수 없다는 제약이 있다.