The Proxy Pattern provides a surrogate or placeholder for another object to control access to it.
프록시 패턴은 다른 개체에 대한 대체 또는 자리 표시자를 제공할 수 있는 구조적 디자인 패턴이다.
프록시는 원래 개체에 대한 액세스를 제어하므로 요청이 원래 개체에 전달되기 전이나 후에 수행할 수 있다.
실제 작업은 RealSubject 에서 처리되며, Proxy 는 RealSubject 객체를 대신하면서 접근을 제어한다.
Proxy 에는 RealSubject 에 대한 레퍼런스가 들어 있고, 클라이언트는 항상 Proxy 를 통해 RealSubject 과 데이터를 주고 받는다.
장점
- 클라이언트가 알지 못하는 상태에서 서비스 개체를 제어할 수 있다
- 클라이언트가 신경 쓰지 않을 때 서비스 개체의 수명 주기를 관리할 수 있다 (프록시는 서비스 개체가 준비되지 않았거나 사용할 수 없는 경우에도 작동함)
- 개방/폐쇄 원칙 => 서비스나 클라이언트를 변경하지 않고 새 프록시를 도입할 수 있다
단점
- 많은 새 클래스를 도입해야 하므로 코드가 더 복잡해질 수 있다
- 서비스의 응답이 지연될 수 있다
왜사용하는가?
Proxy 패턴은 다양한 방식으로 변형 가능하다
- 동적 생성 프록시 => 실제 요청(action() 메소드 호출)이 들어 왔을 때 실제 객체를 생성
- 실제 객체의 생성에 많은 자원이 소모 되지만 사용 빈도는 낮은 경우
- 실제 객체의 생성에 많은 자원이 소모 되지만 사용 빈도는 낮은 경우
- 지연 초기화(가상 프록시) => ex. 항상 가동되어 시스템 리소스를 낭비하는 무거운 서비스 개체가 있는 경우
- 앱이 시작될 때 객체를 생성하는 대신 객체 초기화가 실제로 필요한 시점으로 지연될 수 있다
- 생성하기 힘든 자원에 대한 접근 제한
- 액세스 제어(보호 프록시) => 특정 클라이언트만 서비스 개체를 사용할 수 있도록 하는 경우
- ex. 접근 권한이 필요한 자원에 대한 접근 제어
- 프록시는 클라이언트의 자격 증명이 일부 기준과 일치하는 경우에만 서비스 개체에 요청을 전달할 수 있다
- ex. 개체가 운영 체제의 중요한 부분이고 클라이언트가 다양한 실행 응용 프로그램(악의적인 응용 프로그램 포함)인 경우
- 원격 서비스의 로컬 실행(원격 프록시) => 서비스 개체가 원격 서버에 있는 경우
- 프록시는 네트워크를 통해 클라이언트 요청을 전달하여 네트워크 작업의 모든 세부 사항을 처리
- 로깅 요청(로깅 프록시) => 서비스 개체에 대한 요청 기록을 유지하려는 경우
- 프록시는 서비스에 전달하기 전에 각 요청을 기록할 수 있다
- 캐싱 요청 결과(캐싱 프록시) => 클라이언트 요청의 결과를 캐시하고, 이 캐시의 수명 주기를 관리해야 하는 경우
- 프록시는 항상 동일한 결과를 생성하는 반복 요청에 대해 캐싱을 구현할 수 있다
- 프록시는 요청의 매개변수를 캐시 키로 사용할 수 있다
- 클라이언트가 없을 때 알아서 해제해야 하는 경우 => ex. 무거운 서비스 개체인 경우
- 프록시는 서비스 개체 또는 해당 결과에 대한 참조를 얻은 클라이언트를 추적할 수 있다. 즉, 프록시는 클라이언트를 통해 클라이언트가 여전히 활성 상태인지 확인할 수 있다. 클라이언트 목록이 비어 있으면 프록시가 서비스 개체를 닫고 기본 시스템 리소스를 해제할 수 있다
- 프록시는 클라이언트가 서비스 개체를 수정했는지 여부도 추적할 수 있다. 그리고 변경되지 않은 개체는 다른 클라이언트에서 재사용할 수 있다
'책을 읽자 > Design Patterns' 카테고리의 다른 글
Decorator Pattern (0) | 2021.08.18 |
---|---|
Template Method Pattern (0) | 2021.08.02 |
Strategy Pattern (0) | 2021.08.02 |
Flyweight Pattern (0) | 2021.01.19 |
Bridge Pattern (0) | 2021.01.19 |