책너두 (헤드 퍼스트 디자인 패턴) 38일차 (~513p)

요약

  • 프록시 패턴
    • 보호 프록시 만들기
    • 객체마을 데이팅 서비스
    • Person 인터페이스용 동적 프록시 만들기
      • 1단계 : Invocationhandler 만들기
        • 호출 핸들러 만들기
      • 2단계 : 동적 프록시 생성 코드 만들기

메모

보호 프록시 만들기

  • java.lang.reflect 패키지 안에 프록시 기능이 내장되어 있음.
    • 즉석에서 하나 이상의 인터페이스를 구현하고, 지정한 클래스에 메소드 호출을 전달하는 프록시 클래스를 만들 수 있음.
    • 진짜 프록시 클래스는 실행 중에 생성되므로 이러한 자바 기술을 동적 프록시(dynamic proxy)라고 부름

  • 이번에는 프록시가 2개의 클래스로 구성됨.
  • 자바에서 Proxy클래스가 Subject 인터페이스 전체를 구현함.
  • Proxy 객체의 모든 메소드 호출을 전달받는 InvocationHandler를 제공해야 함.
    • Invocationhandler에서 RealSubject 객체에 있는 메소드로의 접근을 제어함.

객체마을 데이팅 서비스

  • 이 서비스에서는 서로 상대방의 괴짜 지수(좋은 쪽으로 얼마나 괴짜인지 따지는 점수)를 매기는 기능을 더해, 사용자들이 더 적극적으로 서비스를 사용하고, 더 좋은 상대를 찾을 수 있도록 함.
  • 이때, 다른 사람이, 내 관심 사항을 바꾸거나, 자기 선호도 점수를 조작해서 왕창 올려놓는 일을 제재해야 함.
    • 이때, 보호 프록시(Protection Proxy)를 사용해야 함.
      • 접근 권한을 바탕으로 객체로의 접근을 제어하는 프록시임.

Person 인터페이스용 동적 프록시 만들기

  • 자기 괴짜 지수를 직접 조작할 수 없어야하고, 다른 사람들의 개인 정보도 수정할 수 없도록 해야 함.
    • 이 문제를 해결하기 위해 2개의 프록시를 만들어야 함.
    • 하나는 본인의 Person 객체에 접근하는 프록시, 다른 하나는 다른 사람들의 Person 객체에 접근하는 프록시임.
  1. 2개의 Invocationhandler 만들기
    • InvocationHandler는 프록시의 행동을 구현함.
    • 프록시 클래스와 객체를 만드는 일은 자바에서 알아서 해 주기에, 프록시의 메소드가 호출되었을 때 할 일을 지정해 주는 핸들러만 만들면 됨.
  2. 동적 프록시 생성 코드 만들기
    • 프록시 클래스를 생성하고, 그 인스턴스를 만드는 코드가 필요함.
  3. 적절한 프록시로 Person 객체 감싸기
    • Person 객체를 사용하는 객체는 고객 자신의 객체(owner), 아니면 데이텅 서비스를 사용하는 다른 고객의 객체(non-owner), 이렇게 둘 중 하나임.

1단계 : Invocationhandler 만들기

  • 호출 핸들러란, 프록시의 메소드가 호출되면, 프록ㄷ시는 그 호출을 호출 핸들러에게 넘김.
    • 하지만 호출 핸들러에 있는 같은 이름의 메소드를 호출하는 것은 아님.
    • 메소드는 invoke() 하나 뿐임.
    • 프록시의 어떤 메소드가 호출되든, 무조건 핸들러에 있는 invoke() 메소드가 호출됨.

호출 핸들러 만들기

  • 프록시의 메소드가 호출될 때마다 invoke 메소드를 호출함.
    • getter, setter 메소드는 본인한테 모두 허용해줘야 하므로 주제에 있는 메소드를 호출함.
    • setGeekRating 메소드 (레이팅 점수 매기기)는 본인이 호출하면 안되므로 IllegalAcceessException 을 던져서 호출을 막음.

2단계 : 동적 프록시 생성 코드 만들기

  • Person 객체를 인자로 받고, 본인용 프록시를 만드는 메소드를 만들어야 함.
    • 즉, 메소드 호출을 OwnerInvocationHandler에게 넘겨주는 프록시를 만듦.
    • p512 참고

댓글

Designed by JB FACTORY