deblog

[Spring] JDK 프록시와 CGLIB 기반 프록시(proxy) 본문

IT/JAVA

[Spring] JDK 프록시와 CGLIB 기반 프록시(proxy)

스콘_ 2021. 11. 25. 09:56
반응형

프록시란?

proxy라는 단어의 뜻은 대리, 위임의 뜻입니다. 

Spring에서의 프록시는 메서드 호출을 인터셉트하고 필요한 경우 특정 메서드에 적용되는 어드바이스 체인을 실행하는 것입니다.

 

스프링에서 프록시의 기능

어드바이스의 관리와 호출은 대부분 프록시와 독립적이며 스프링 AOP 프레임 워크가 관리합니다.

하지만 프록시는 모든 메서드 호출을 인터셉트하고 필요에 따라 어드바이스를 적용할 수 있도록 AOP 프레임 워크에 전달해야 할 책임이 있습니다.

프록시는 추상 클래스인 AopContext클래스로 자신을 외부로 노출하도록 구성해 프록시를 가져오고 대상 객체의 프록시를 사용해 어드바이스가 적용된 메서드를 호출 가능합니다.

프록시는 ProxyFactory.setExposeProxy()를 통해 이 옵션을 활성화하면 프록시 클래스가 적절하게 노출되게 합니다.

모든 프록시 클래스는 기본적으로 Advised 인터페이스를 구현합니다.

이 인터페이스를 사용하면 프록시가 생성된 후 어드바이스 체인을 변경할 수 있습니다. 또한 프록시는 프록시가 적용된 대상을 반환하는 모든 메서드가 실제로 대상이 아닌 프록시를 반환해야 합니다.

 

JDK 프록시

스프링에서 사용할수 있는 가장 기본적인 프록시 타입.

특정 메서드 호출을 처리하는 방식에 대한 모든 결정이 런타임에 메서드가 호출 될때마다 이뤄집니다.

클래스가 아닌 인터페이스 프록시만을 생성 가능. 프록시를 적용하는 모든 객체는 적어도 하나의 인터페이스를 구현해야 하고, 결과로 생성되는 프록시는 그 인터페이스를 구현하는 객체가 됩니다.

JDK 프록시를 사용하면 JVM이 모든 메서드 호출을 인터셉트해 프로기의 invoke() 메서드를 라우트합니다. 그런 다음에 invoke() 메서드는 호출된 어드바이스가 적용된 메서드인지(포인트컷에서 정의한 규칙에 따라) 결정하고 어드바이스 적용대상이라면 어드바이스 체인을 호출한 후에 리플렉션을 사용해 메서드 자체를 호출합니다.

이 외에도 invoke() 메서드는 이전 절에서 설명한 모든 로직을 수행합니다.

그래서 프로기사 리플렉션을 통해 어드바이스가 적용되지 않은 메서드를 호출하는 것 이외의 추가 처리를 하지 않지만, 메서드가 호출될 때마다 런타임 성능에 오버헤드를 발생시킵니다.

 

ProxyFactory가 JDK 프록시를 사용하게 하려면 ProxyFactory 클래스가 간접적으로 상속하는 AdvisedSupport 클래스에서 setInterfaces()를 사용해 프록시 인터페이스 목롤을 지정하면 됩니다.

 

 

CGLIB 프록시

각 프록시에 대해 동적으로 새 클래스에 대한 바이트코드를 생성하고 이미 생성된 클래스를 사용할 수 있으면 재사용 합니다. 이때 생성되는 프록시 타입은 대상 객체 클래스의 하위 클래스가 됩니다.

CGLIB 프록시는 실제 바이트코드를 생성하기 때문에 메서드를 더 유연하게 처리할 수 있습니다. 예를 들어 CGLIB 프록시는 어드바이스가 적용되지 않은 메서드를 직접 호출하여 적절한 바이트코드를 생성해 프록시로 인한 성능 오버헤드를 줄입니다. 또한 CGLIB 프록시는 메서드가 this를 반환할 수 있는지 판단합니다. this를 반환할 수 없을 때에는 메서드를 직접 호출할 수 있게 하여 런타임 성능 오버헤드를 줄입니다.

 

CGLIB 프록시는 고정 어드바이스 체인도 처리합니다. 고정 어드바이스 체인은 프록시가 생성된 후 변경되지 않는 것을 보장하는 체인입니다. 기본적으로 프록시를 생성한 후에도 어드바이저와 어드바이스를 변경할 수 있습니다. 물론 이기능을 거의 필요하지 않은 기능이기는 합니다. CGLIB 프록시는 고정 어드바이스 체인을 특정 방식으로 처리해 어드바이스 체인을 실행하는 런타임 성능 오버헤드를 줄입니다.

 

 

 

[출처 : 전문가를 위한 스프링5]

'IT > JAVA' 카테고리의 다른 글

[Spring] AspectJ란?  (0) 2021.11.24
[JAVA] Collection (1)  (0) 2021.08.27
heap과 stack의 차이점은?  (0) 2021.04.28
오버라이딩과 오버로딩의 차이  (2) 2021.04.28
AOP(Aspect Oriented Programming) 실습(3)  (0) 2021.04.17
Comments