티스토리 뷰

Java

Java - 클래스 프록시 생성하기

사용자 엔꾸꾸 2019. 11. 11. 23:07

클래스 프록시 생성하기

  • 서브클래스를 만들수 있는 라이브러리를 사용하여 프록시를 만들 수 있다.

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 생성자
  • 인터페이스가 존재할 경우 인터페이스 프록시를 만들어 사용하는것이 좋다.
댓글
댓글쓰기 폼
공지사항
Total
75,689
Today
205
Yesterday
201
링크
TAG
more
«   2021/12   »
      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 29 30 31  
글 보관함