티스토리 뷰
클래스 프록시 생성하기
- 서브클래스를 만들수 있는 라이브러리를 사용하여 프록시를 만들 수 있다.
CGlib
- Spring, Hibernate 에서 사용하는 라이브러리다.
- 하위버전 호환이 좋지 않은 라이브러리이기 때문에 각자 다른 라이브러리에 내장된 형태로 많이 배포된다.
CGlib를 사용한 프록시 생성 방법
Enhancer 클래가 CGlib의 핵심 클래스이다.
Enhancer의 create 메소드를 사용해 프록시를 생성할 수 있으며, 첫번째 인자로는 상위 클래스 (어떤 클래스의 프록시인가), 두번째인자는 해당 프록시의 handler를 넘겨주면 첫번째 인자의 타입의 프록시 객체가 생성된다.
MethodInterceptor 를 통해 handler를 구현할 수 있으며 이는 InvocationHandler와 비슷한 형태로 구현해 주면된다.
ByteBuddy
- htts://bytebuddy.net
- 이전에 살펴본 바이트코드 조작뿐 아니라 런타임 프록시를 만들때도 사용할 수 있다.
ByteBuddy를 사용한 프록시 생성 방법
byteBuddy는 인스턴스를 바로 만들어 주지않고, 클래스를 만들어 주어야한다.
byteBuddy의 subClass 메소드를 통해 BookService를 상속받는 서브클래스를 생성한다.
.method() 메소드를 통해 특정 메소드를 pick할 수 있으며 intercept를 통해 InvocationHandler로 위임할 수 있다.
이때 .method() 를 통해 특정 메소드를 칭했기 때문에 특정 메소드를 호출할때만 프록시가 적용된다. 구현방법은 이전과 동일하다.
.make().load() 메소드를 통하여 Class 타입 인스턴스를 생성해준뒤. Dynamic 프록시를 사용하여 프록시 객체를 생성한다.
서브클래스를 만드는 방법의 단점
- 상속을 하지 못하는 경우 프록시를 생성할 수 없다.
- final class
- private 생성자
- 인터페이스가 존재할 경우 인터페이스 프록시를 만들어 사용하는것이 좋다.
'Java' 카테고리의 다른 글
Java - 애노테이션 프로세서 (0) | 2019.11.12 |
---|---|
Java - 다이나믹 프록시 정리 (0) | 2019.11.11 |
Java - 다이나믹 프록시 실습 (0) | 2019.11.11 |
Java - 다이나믹 프록시 _ 프록시 패턴 (0) | 2019.11.07 |
Java - Reflection 정리 (0) | 2019.11.06 |
댓글