상세 컨텐츠

본문 제목

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

Programming/TIL

by 홍잭슨 2021. 12. 12. 23:38

본문

  •  리플렉션
    • 주의할 점
      • 지나친 사용은 성능 이슈를 야기할 수 있다. 필요한 경우에만 사용할 것
      • 컴파일 타임에 확인되지 않고 런타임 시에만 발생하는 문제를 만들 가능성이 있다
      • 접근 지시자를 무시할 수 있다
    • 스프링
      • 의존성 주입
      • 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
    • ...

'Programming > TIL' 카테고리의 다른 글

TIL : JUnit, Mockito  (0) 2021.12.20
TIL : JUnit - 테스트 순서, Properties  (0) 2021.12.17
TIL : JUnit  (0) 2021.12.15
TIL: JUnit  (0) 2021.12.14
TIL: Anotation Processor  (0) 2021.12.13

관련글 더보기