리타의 저장소

Spring AOP | JDK Dynamic Proxy & CGLIB Proxy 본문

Dev/Backend

Spring AOP | JDK Dynamic Proxy & CGLIB Proxy

ريتا 2025. 10. 11. 23:43

Spring AOP

 


JDK Dynamic Proxy & CGLIB Proxy

 

Spring AOP는, 대상 객체가 ‘인터페이스’를 구현했는지 여부에 따라, JDK Dynamic Proxy / CGLIB Proxy 중 하나를 자동 선택하여 AOP를 적용하게 된다.

 

프록시 방식설명동작 조건사용 기술

JDK Dynamic Proxy 인터페이스 기반 대상 클래스가 인터페이스를 구현하고 있을 때 java.lang.reflect.Proxy
CGLIB Proxy 클래스 기반 인터페이스가 없을 때 또는 강제로 사용 시 net.sf.cglib (Spring 내부에 내장)

 


 

자동 선택한다는 것에 대한 내용을 조금 더 보완하자면,

 

Spring AOP 자체적으로 프록시 생성과 방식 선택의 로직을 내장하고 있다. 즉, 개발자가 모든 걸 일일히 설정하지 않아도, Spring이 상황에 따라 자동으로 프록시를 만들고, 방식 (JDK Dynamic Proxy | CGLIB Proxy) 을 선택한다.

  1. 어떤 빈에 AOP를 적용할지 판단 (Advisor, Prointcut 등 확인)
  2. 해당 빈을 프록시 객체로 감쌀지 결정
  3. 감싼다면, JDK Proxy 인지 CGLIB 로 할지 결정
  4. 결정된 방식으로 프록시 객체 생성
  5. ApplicationContext에 등록할 때는 프록시 객체로 등록

여기서 , Spring AOP의 프록시 선택 기준이 바로 “인터페이스”유무에 따라 결정된다고 보면된다.

개발자가 설정이 불가능하냐 ? 그건 또 아니다. 개발자가 충분히 명시적으로 어떤 Proxy를 선택할지 제어할 수도 있다.

 

 @EnableAspectJAutoProxy(proxyTargetClass = true) => 무조건 CGLIB Proxy 채택 설정을 통해 관여 가능


Dynamic Proxy (동적 프록시)

프록시 디자인 패턴은 대상 원본 클래스 수만큼 일일히 프록시 클래스를 만들어줘야 한다는 단점이 존재한다. 즉, 프록시 적용 대상 객체가 100개면 프록시 객체도 100개를 만들어줘야 한다는 뜻이다. 이로 인해 코드량이 많아지게 되고 중복이 발생해서 코드의 복잡도가 증가한다는 한계점이 존재한다.

 

이러한, 프록시 클래스 수동 생성의 한계를 극복하고자 나온 개념이 바로 “동적 프록시 (Dynamic Proxy)” 이다.

Dynamic Proxy의 경우 런타임에 “프록시 클래스”를 자동으로 생성해서, 공통 기능을 동적으로 주입하는 기술이다. JDK Dynamic Proxy, CGLIB Proxy 모두 바로 이 “Dynamic Proxy (동적 프록시)” 기술에 해당된다.