리타의 저장소

Spring AOP | 돌고돌아 JDK Dynamic Proxy vs CGLIB Proxy 본문

Dev/Backend

Spring AOP | 돌고돌아 JDK Dynamic Proxy vs CGLIB Proxy

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

Spring AOP

 

 

 

JDK Dynamic Proxy vs CGLIB Proxy

1. MethodProxy#invokeSuper() vs Reflection, 성능상의 차이

CGLIB Proxy의 경우 MethodProxy 객체를 통해 원본 메서드를 호출하고, 이 내부는 FastClass 매커니즘으로 구현되어있어, Reflection보다 빠르다.

JDK Proxy CGLIB Proxy (FastClass)

Method.invoke(target, args) methodProxy.invokeSuper(obj, args)
리플렉션 기반 → 런타임에 메서드 이름/파라미터를 해석 사전 생성된 index 기반 → 배열 lookup 방식
느림 (JVM 최적화 전에는 특히) 빠름 (정적 인덱스 테이블로 바로 호출)

 

2. 타입 변환 가능성 차이

 

예를 들어, 아래와 같이, SalePolicy, 그리고 SalePolicy를 구현한 구현체 BlackFridayPolicy가 있다고 생각해보자.

public interface SalePolicy {
	...
}

public class BlackFridayPolicy implements SalePolicy {
	...
}

 

 JDK Proxy는 인터페이스 기반이다. 이 말인 즉슨, 구체 클래스로의 타입 캐스팅이 불가하다는 것.

SalePolicy jdkProxy = (SalePolicy) Proxy.newProxyInstance(...);

// ❌ 컴파일 에러 or ClassCastException
BlackFridayPolicy casting = (BlackFridayPolicy) jdkProxy;

 

 CGLIB Proxy는 구체 클래스를 상속한다. 이런 경우 생성된 프록시는 BlackFridayPolicy를 상속받은 객체이다. 따라서, BlackFridayPolicy타입으로 캐스팅도 가능하고, 해당 클래스가 구현한 인터페이스인 SalePolicy로도 캐스팅 가능하다.

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(BlackFridayPolicy.class);

 

3. CGLIB의 구조적 한계 (feat.final,private constructor- 상속 기반 프록시의 태생적 제약)

❗ final 메서드 or 클래스 의 경우 프록시 적용 불가하다.

final은 오버라이드가 불가하다. 즉, MethodInterceptor를 끼워넣을 수가 없다.

→ final class, final method 모두 CGLIB의 프록시 생성을 막는다.

public final class A { }         // ❌ CGLIB 프록시 생성 불가
public class B {
    public final void method(){} // ❌ CGLIB이 intercept 못함
}

 

❗ private 생성자 클래스의 경우 프록시 적용 불가하다.

프록시는 상속 + 생성자 호출로 형성된다. 헌데, 부모 클래스의 생성자가 private이라면, 인스턴스 생성 자체가 불가능하게 된다.

public class FactoryOnly {
    private FactoryOnly() {} // ❌ Enhancer.create() 호출 불가
}

→ Factory 패턴, static factory method, Builder 등이 쓰이는 객체의 경우 CGLIB로 프록시 적용하는 것이 어렵다.

 

 

솔직히 스프링 AOP를 몇날 몇일동안 하는건지 모르겠다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 해도 해도 끝이없다. 여러 블로그를 참고해가며 Notion에 정리하고 있던 것을 블로그에 옮겨적고 있는데 지금 옮겨 적으면서 다시 보는데도 정말 끝이없구나 싶다 ㅎㅎ

 

요새 이것저것 회사에서 많이 하고 있어서 블로그를 할 새가 없다. 올초 이후엔 더이상 남아있던 정산건도 없는 것 같고, API 최신화도 당분간 스탑되어서 운영업무는 사실상 거의 안하고 있는데, 내부적으로 내재화 관련 건들이 있어서 새로운 도메인들을 공부중이다. 나름 재미있는 것 같기도하고,, 기술공부를 짬짬히 해야하는데 인수인계 때문에 한동안 공부를 못했던 것 같다. 다시 열심히 해야지,,, 흙