Spring의 AOP Proxy

Hansu Kim·2022년 11월 1일
0

Spring boot

목록 보기
10/10

Spring의 AOP는 부가 기능을 핵심 기능으로부터 분리하고 접근을 제어하기 위해 등장한 기술이다.

Proxy 객체를 통해 객체를 사용하게 되면 아래와 같은 장점이 있다.

  • 본래 객체의 메소드가 호출되기 이전에 부가 기능들을 적용할 수 있다.
  • 객체를 최소한으로 생성하고 필요 시점까지 생성을 미룰 수 있다.
  • 핵심 기능과 부가 기능을 분리하여 가독성을 높인다.
  • 접근권한을 제어할 수 있다.
  • 캐싱을 사용할 수 있다.

다만 이런 프록시 방식은 본래 객체와 프록시 객체의 빈이 같이 등록되어있어야 한다는 점과 순환 참조 발생 가능성이 있다.

그에 따라 스프링에선 아래와 같은 방식으로 AOP를 제공한다

JDK Dynamic proxy

Java에서 제공하는 자동 프록시 생성기를 통해 직접 프록시 객체를 생성한 후에 처리해주는 것.
Reflection을 통해 프록시를 생성하기 때문에 성능 오버헤드가 있다.

또한 프록시를 생성할 때, 인터페이스를 기반으로 생성하기 때문에 인터페이스를 구현한 클래스가 아니면 프록시 객체를 생성할 수 없다.

Spring CGLib Proxy

JDK Dynamic proxy 방식에선 클래스 구현체가 인터페이스를 상속하지 않았을 경우 프록시 객체를 생성할 수 없었으며, 이 문제를 해결하기 위해선 프록시 객체가 클래스 구현체를 상속할 수 있어야 한다.
그에 따라 Spring에서는 CGLib라는 바이트 조작 라이브러리를 통해 클래스 상속으로 프록시를 구현한다.

다만 CGLib 프록시는 상속을 이용하므로, 기본 생성자를 필요로 하며 생성자가 2번 호출되고 final 클래스/메소드를 사용할 수 없다는 제약이 있다.

참고자료: https://mangkyu.tistory.com/175

0개의 댓글