공부내용공유

Spring Proxy Factory 뜯어보기 본문

Spring/Spring

Spring Proxy Factory 뜯어보기

forfun 2023. 9. 5. 20:11

서론


스프링 Proxy를 공부하면서 Proxy Factory 에 대해 알게되었다.

Proxy Factory는 interface 를 구현하고 있는 class 의 경우에는 JDK 동적 프록시를 사용해서, interface 를 구현하고 있지 않은 경우에는 CGLIB 를 사용해서 프록시를 만들어 주는 식으로 동작한다.

Proxy Factory 가 어떻게 이를 구분하고 어떤식으로 proxy 객체를 만드는지 궁금해서 코드를 직접 보면서 간단하게 정리하였다.

본론


프록시 팩토리를 생성하고 해당 팩토리에서 프록시를 가져오는 코드를 먼저 살펴보면

  1. 프록시 대상으로 삼을 클래스를 정해준다.
  2. ProxyFactory 생성자에 해당 클래스를 넣어서 proxyFactory 를 생성한다.
  3. 해당 Factory 에 사용하고 싶은 프록시 기능 (advice 로 추상화 되어 있다)을 추가한다.
  4. getProxy 를 통해 proxy 를 얻고 사용한다.

여기서 내가 개인적으로 궁금했던것은 어떤 방식으로 인터페이스가 있는 클래스와 없는 클래스를 구별할까였다. 그래서 ProxyFactory 코드를 열어서 전부다는 아니지만 타고 들어가면서 각 기능을 찾아보고 정리하였다.

위 코드에서 사용한 ProxyFactory 생성자 코드이다. 이 생성자 말고 다른 오버로딩된 생성자들도 많지만 일단 이 생성자만 타고 들어갔다.

setTarget 은 프록시를 만들 대상 (target) 을 targetsource 라는 필드에 주입해주는 역할이다.

setInterFace 는 말 그대로 AdvisedSurpport 에 선언되어져 있는 interfaces 필드에 대상 클래스가 구현하고 있는 interface 를 넣어주는 코드이다.

interface 를 얻는 방법은 타고타고 들어가보니

ClassUtils 에 선언되어져 있는 getAllInterfacesForClassAsSet 라는 메서드가 있는데

이런식으로 interface 여부를 알아볼 class 와 classLoader 를 파라미터로 받는다, Proxy Factory 에서는 ClassLoader 는 null 로 전달하여 모든 선언된 interface 를 받는다.

이를 통해 Class 에 선언되어져있는

리플렉션을 이용하는 해당 메소드를 통해 interface 를 얻는 방식이였다.

이런식으로 target, interface 들을 등록한다. 그 후 addAdvice 를 통해 advice 를 추가한다.

Proxy Factory 가 상속하고 있는 AdvisedSurpport 가 AdviceList 를 가지고 있고 해당 list 에 추가를 하는 방식이다.

여러 절차를 거쳐 이러한 식으로 advice 를 해당 proxy factory 의 adviceList 에 추가한다.

그후 getProxy를 통해 proxy 객체를 얻는 과정에서는

class 이냐 interface 이냐 뿐만 아니라 다른 다양한 조건으로 어떠한 방식으로 proxy 를 생성할지 결정한다. interface, proxyClass , lambda classs 의 경우 JDK 동적 프록시 방식으로 proxy를 생성함을 볼 수 있다.

  • JdkDynamicAopProxy

  • ObjenesisCglibAopProxy

각 class 들을 보면 반가운 invoke 들도 구현되어져 있다.

결론


타고 들어가면서 느낀건 정말 방대하다 였다. 해당 글에는 전부 다루지 않았지만 classLoader 부터 JDK , 리플렉션 등등 정말 많은 요소들이 포함되어 있었다.

지금 당장 그 모든걸 깊게 공부하는것은 비효율적이라 생각해 일단 이런게 있구나 정도만 하고 Proxy Factory 가 어떤식으로 흘러가는지 간단하게 흐름만 정리하고 메소드만 확인하였다.

앞으로 자바 기반으로 한 프로젝트를 하면서 Proxy 를 다루는 일이 생긴다면 한번쯤은 각 요소 하나하나 모두 분석하고 싶다.