프로그래밍/Java

다이나믹 프록시

hyokeunLee 2022. 5. 3. 17:42

런타임(애플리케이션이 실행되는 도중)에 특정 인터페이스들을 구현하는 클래스 또는 인스턴스를 만드는 기술을 다이나믹 프록시라 한다.

 

프록시 인스턴스  

프록시 인스턴스는 Object Proxy.newProxyInstance(ClassLoader, Interfaces, InvocationHandler) 를 통하여 구현할 수 있다.

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

하지만, 기능을 추가할 때마다 InvocationHandler 에 계속해서 조건을 추가해주어야하는데 이는 유연한 구조는 아니다.
이러한 문제를 해결하기 위해 위 구조를 스프링이 정의한 인터페이스로 재 구현하였고, 그것이 스프링 AOP 이다.
(위 같은 이유로 스프링 AOP 를 프록시 기반의 AOP 라 부르기도 한다.)



 

정리

다이나믹 프록시

  • 런타임에 인터페이스 또는 클래스의 프록시 인스턴스 또는 클래스를 만들어 사용하는 프로그래밍 기법

다이나믹 프록시 사용처

  • 스프링 데이터 JPA
  • 스프링 AOP
  • Mockito
  • 하이버네이트 lazy initialzation

 

 

 

참고

백기선 - 더 더자바, 코드를 조작하는 다양한 방법

'프로그래밍 > Java' 카테고리의 다른 글

Stream  (0) 2022.05.04
Lombok 동작원리  (0) 2022.05.03
클래스 로더 (class loader)  (0) 2022.05.01
JVM 구조  (0) 2022.04.30
JDK, JRE, JVM 이해하기  (0) 2022.04.29