- 이번주에는 정말 너무너무 바빠서 손글씨로 정리했습니다ㅠ
추가
프록시는 두가지 방식이 있다
- 두가지 프록시 구현방식의 장단점을 비교하면
- 프록시 사용예시
- Spring data jpa 프로젝트 : spring boot 와 무관하게 repostiroy를 자체적으로 jdk 동적 프록시를 이용해서 생성하고 있습니다
- 참고로스프링은 CGLib을 쓴다 성능때문에
- 성능비교 JDK-Dynamic vs CGLIB (코드추가 필요 @@)
CGLIB 기반 Dynamic Proxy 구현 방식
- 코드 생성 라이브러리(Code Generator Library), 런타임에 동적으로 자바 클래스의 프록시를 생성해주는 기능
- 장점
- 실제 바이트 코드를 조작하여 JDK Dynamic Proxy 보다 상대적으로 빠르다.
- 대상 객체가 인터페이스를 가지지 않았을 경우 사용한다.
- 인터페이스를 가져도 사용할 수 있다. aop:config의 proxy-target-class를 true로 설정.
- 대상 객체가 정의한 모든 메서드를 프록시 하여야하는 경우 사용한다.
- 제약
- 버전별 호환성이 좋지 않다. (사용 라이브러리 내부에 내장시켜 제공한다.)
- final이나 private 같이 상속된 객체에 Overriding을 제공하지 않는다면 해당 행위에 대해서 Aspect를 적용할 수 없다.
- CGLIB Dynamic Proxy 를 사용하는 라이브러리
- Spring Boot AOP (Proxy)
- Hibernate
JDK Dynamic Proxy 기반 Dynamic Proxy 구현방식
- JDK Dynamic Proxy?
- Java 에서 지원하는 동적(런타임) Proxy 구현 방식이다.
- 특정 인터페이스들을 구현하는 클래스나 인스턴스를 만드는 기술이다.
- Reflection API을 사용하여 Target Class의 method를 invoke()를 통해 동작시킨다.
- invoke?(해석 : 부르다)
- 클래스의 이름과 인자 값을 넘겨서 객체의 메서드를 실행시키는 메서드이다.
- 인자 값을 이용하여 메서드를 실행시키게 된다.
- 제약
- 인터페이스 기반의 Proxy → 모든 Target Class 는 Interface를 implement 하고 있어야 한다.
- JDK Dynamic Proxy 단점
- Advise 대상이든 아니든 모든 Method Call 마다 reflection API의 invoke를 실시한다.
- 다시말해 Method invoke를 우선 진행하고 Advise 유무를 판단한다.
- JDK Dynamic Proxy 를 사용하는 라이브러리
- Spring AOP ProxyFactory ( JDK Dynamic Proxy 를 추상화하고 재정의한 Class)
- Spring Data JPA RepositoryFactorySupport (BeanClassLoaderAware, BeanFactoryAware)
출처: https://lob-dev.tistory.com/entry/Java에서-구현할-수-있는-Proxy-들-Pure-JDK-CGLIB