일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Junit 5
- 자바
- 일상
- 소프티어
- ObjectMapper
- Coputer Science
- OS
- db
- ExceptionResolver
- mapstruct
- Test Doulbe
- Test code
- Spring
- Java
- modelmapper
- enumSet
- 테크쇼
- Service 계층 테스트
- proxyFactory
- JPQL
- softeer
- FCM
- Test
- RequestBody
- 인프콘2023
- MySQL
- backend
- 공룡책
- Server
- JPA
- Today
- Total
공부내용공유
Spring Proxy Factory 뜯어보기 본문
서론
스프링 Proxy를 공부하면서 Proxy Factory 에 대해 알게되었다.
Proxy Factory는 interface 를 구현하고 있는 class 의 경우에는 JDK 동적 프록시를 사용해서, interface 를 구현하고 있지 않은 경우에는 CGLIB 를 사용해서 프록시를 만들어 주는 식으로 동작한다.
Proxy Factory 가 어떻게 이를 구분하고 어떤식으로 proxy 객체를 만드는지 궁금해서 코드를 직접 보면서 간단하게 정리하였다.
본론
프록시 팩토리를 생성하고 해당 팩토리에서 프록시를 가져오는 코드를 먼저 살펴보면
- 프록시 대상으로 삼을 클래스를 정해준다.
- ProxyFactory 생성자에 해당 클래스를 넣어서 proxyFactory 를 생성한다.
- 해당 Factory 에 사용하고 싶은 프록시 기능 (advice 로 추상화 되어 있다)을 추가한다.
- 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 를 다루는 일이 생긴다면 한번쯤은 각 요소 하나하나 모두 분석하고 싶다.
'Spring > Spring' 카테고리의 다른 글
getFile 사용시 주의점 (feat: FileNotFoundException) (0) | 2023.10.06 |
---|---|
FCM 기능 구현 및 리팩토링을 하면서의 고민들 (0) | 2023.09.08 |
Test Code H2 DB 사용시 주의사항 (0) | 2023.07.28 |
Junit 5 Service,Mapstruct, ModelMapper Unit Test (단위 테스트) (0) | 2023.07.07 |
Spring ModelMapper, MapStruct 적용에 관하여 (2) | 2023.06.01 |