티스토리 뷰

dev_note/Spring

다이내믹 프록시

jjoylee 2021. 7. 10. 17:05

다이내믹프록시

  • 프록시 팩토리에 의해 런타임에 프록시가 생성된다.
  • 리플랙션을 사용하기 때문에 인터페이스를 직접 구현할 필요 없음.
  • InvocationHandler를 사용해서 중복이 발생하는 것을 해결해준다.

생성

  • newProxyInstance 메소드 사용
Hello proxiedHello = (Hello) Proxy.newProxyInstance(getClass().getClassLoader(),
                new Class[]{ Hello.class }, new UppercaseHandler(new HelloTarget())); // 인터페이스, InvocationHandler 구현체

InvocationHandler

  • invoke() 메소드 하나만 가지고 있는 인터페이스
  • 프록시의 메소드가 호출됐을 때 invoke() 메소드가 호출된다.
  • invoke() 메소드에서 기능을 확장할 수 있다. 부가기능 구현
  1. Client에서 newProxyInstance 메소드로 생성한 프록시 객체의 매소드 호출
  2. InvoactionHandler의 invoke() 메소드 호출
  3. method.invoke(target, args)로 타깃 오브젝트 메소드 호출(reflection)
public class UppercaseHandler implements InvocationHandler {

    Object target;

    public UppercaseHandler(Hello target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // proxy : 프록시 객체, method : 호출한 메소드, args : 전달받은 인자
        Object ret = (String)method.invoke(target, args); // 위임
        if (ret instanceof String && method.getName().startsWith("say")){
            return ((String)ret).toUpperCase(); // 부가기능
        } else {
            return ret;
        }
    }
}

Reference


https://live-everyday.tistory.com/217

'dev_note > Spring' 카테고리의 다른 글

FrontController Pattern & MVC  (0) 2021.09.09
Servlet & JSP & MVC Pattern  (0) 2021.09.02
서블릿 Http Request & Http Response  (0) 2021.08.29
웹 애플리케이션 이해하기  (0) 2021.08.28
Spring AOP  (0) 2021.07.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함