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