TIL: 리플렉션, 다이나믹 프록시

TIL: 리플렉션, 다이나믹 프록시

리플렉션 주의할 점 지나친 사용은 성능 이슈를 야기할 수 있다. 필요한 경우에만 사용할 것 컴파일 타임에 확인되지 않고 런타임 시에만 발생하는 문제를 만들 가능성이 있다 접근 지시자를 무시할 수 있다 스프링 의존성 주입 MVC 뷰에서 넘어온 데이터를 객체에 바인딩 할 때 하이버네이트 @Entity 클래스에 Setter가 없다면 리플렉션을 사용한다

** Proxy 클래스는 Reflect 클래스 안에 속한다

스프링 데이터 JPA는 어떻게 동작하는가 JPARepository를 상속 받은 interface는 프록시를 통해 객체를 생성한다

프록시 패턴 프록시와 리얼 서브젝트가 공유하는 인터페이스가 있고, 클라이언트는 해당 인터페이스 타입으로 프록시를 사용한다. 클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 프록시는 리얼 서브젝트에 대한 접근을 관리하거나 부가기능을 제공하거나, 리턴값을 변경할 수 있다.

다이나믹 프록시 - 런타임에 생성되는 프록시 (리플렉션의 일부)

프록시를 사용하는 대표적인 예 : Spring Data JPA JpaRepository를 상속받는 것만으로 Interface를 통해서 객체가 생성됨 스프링 AOP 가장 밑단에 존재함 ProxyFactory에서 생성된 객체 중 하나가 JpaRepository를 상속받은 객체 Proxy → AOP → ProxyFactory를 제공함 Proxy라는 클래스에서 다 시작된다

프록시객체를 생성하면서 인터페이스 타입에 할당해주는 방법

BookService bookService = (BookService) Proxy.newProxyInstance(BookService.class.getClassLoader(), new Class[]{BookService.class}, new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ if(method.getName().equals("rent")){ sout("aaaa"); Object invoke = method.invoke(bookService, args); sout("bbbb"); return invoke; } return method.invoke(bookService, args); } });

디버거 찍을 때 보던 코드인데 의문이 풀렸다.. 하 코딩뽕..

- AOP도 이런식으로 구성이 되어있다

- 자바는 클래스 기반 보다는 인터페이스 기반의 프록시가 장려된다

- 클래스 기반 프록시 생성은 CGlib, ByteBuddy를 통해 구현 가능하다.

다이나믹 프록시 사용처 Spring Data JPA Spring AOP Mockito Hibernate lazy initialization ...

from http://jacksonhong.tistory.com/49 by ccl(A) rewrite - 2021-12-13 01:01:18