다이내믹 프록시
1. 프록시 패턴의 문제점
•
undefined-4에서 프록시 패턴을 알아보았고, 그것의 단점을 알 수 있었다. 매번 타입에 맞는 프록시 클래스를 생성하는 방식이 아니라, 런타임에 클래스 타입에 맞는 프록시 객체를 생성하는 방법을 알아본다.
2. 코드로 확인하기
class UserServiceTest { private UserService userService; private final User user = new User("flash"); @Test void dynamicProxy() { userService = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(), new Class[]{UserService.class}, new InvocationHandler() { UserService userService = new DefaultUserService(); @Override public Object invoke(Object o, Method method, Object[] args) throws Throwable { if (method.getName().equals("join")) { //join() 에만 proxy 적용 System.out.println("dynamic proxy start"); Object invoke = method.invoke(userService, args); System.out.println("dynamic proxy end"); return invoke; } return method.invoke(userService, args); //나머지 메소드는 proxy 적용 안됨 } }); userService.join(user); userService.terminate(user); } ...}
Java
복사
3. 문제점
•
java 에서 제공해주는 dynamic proxy 는 모든 매소드에 일괄적으로 적용되며 일부 매소드에만 적용하고 싶을 때에는 위의 코드처럼 if 분기를 해주어 수동적으로 설정해야한다. 확장성이 매우 안좋고 유연하지 못한 구조라고 할 수 있다.
◦
그래서 스프링 AOP 가 등장하게 되었다. 자세항 내용은 스프링 AOP 파트 참고!
•
또 하나의 문제점은 위처럼 인터페이스 타입의 프록시만 제공하지, 클래스 타입의 프록시는 제공하지 않는다는 점이다.
◦