핵심 의도

특정 객체로의 접근을 제어하는 대리인을 제공한다. 클라이언트가 실제 객체의 메소드를 호출하면 그 호출을 중간에 가로챈다.

적용 상황

사용되는 상황이 많은데, 공통점은 클라이언트가 진짜 객체에 직접 메시지 요청을 보내지 않도록 한다는 점이다. 진짜 객체에 바로 메시지가 가기 전에 접근을 제어해야 할 때 사용한다.

  1. 원격 프록시

    원격 객체로의 접근을 제어한다. 서로 다른 JVM에 존재하는 객체는 직접 데이터를 주고받을 수 없으므로 프록시 객체를 통해 접근을 제어한다. 원격 프록시는 접근을 제어해 네트워크 관련 사항을 처리한다.

  2. 가상 프록시

    생성하는데 많은 비용이 드는 객체를 대신한다. 진짜 객체가 필요한 상황이 오기 전까지 객체의 생성을 미루거나 객체를 대신한다. 객체 생성이 끝나면 진짜 객체에 직접 요청을 전달한다.

  3. 보호 프록시

    접근 권한이 필요한 자원으로의 접근을 제어한다. 접근 권한마다 프록시를 두어 클라이언트가 진짜 객체에 접근하기 전에 접근 권한을 검사한다. 메시지는 요청을 보낸 클라이언트, 메소드, 인자 등으로 구분할 수 있다.

  4. 방화벽 프록시

    일련의 네트워크 자원으로의 접근을 제어하여 진짜 객체를 나쁜 클라이언트로부터 보호한다.

  5. 스마트 레퍼런스 프록시

    진짜 객체가 참조될 때마다 추가 행동을 제공한다. 객체의 레퍼런스 개수를 센다든가..

  6. 캐싱 프록시

    비용이 많이 드는 작업의 결과를 임시로 저장해 준다. 여러 클라이언트에서 결과를 공유하게 해줌으로써 계산 시간과 네트워크 지연을 줄여준다.

  7. 동기화 프록시

    여러 스레드에서 주제에 접근할 때 안전하게 작업을 처리할 수 있다.

  8. 복잡도 숨김 프록시

    복잡한 클래스의 집합으로의 접근을 제어하고 그 복잡도를 숨겨준다. 퍼사드 프록시라고 부르기도 한다. 이 프록시와 퍼사드 패턴의 차이점은 프록시는 접근을 제어하지만 퍼사드 패턴은 대체 인터페이스만 제공한다.

  9. 지연 복사 프록시

    클라이언트에서 필요로 할 때까지 객체가 복사되는 것을 지연시킴으로써 객체의 복사를 제어한다. 변형된 가상 프록시로 볼 수 있다.

정말 많은 프록시 패턴의 종류가 있는데, 결국 공통점은 클라이언트가 실제 객체의 메소드를 호출할 때 그 호출을 중간에 가로채어 부가 작업을 하는 것에 있다.