Proxy Pattern
프록시 패턴은 실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어하는 디자인 패턴이다. 주체가 되는 클래스가 원격에서 구동중이거나, 그 객체의 생성 비용이 많이 들어 실 사용 시점에 객체를 생성하거나, 실제 객체에 접근 제한 및 제어를 해야 할 때 주로 사용된다. 프록시 클래스는 Wrapper역할을 하여 클라이언트에서는 프록시 클래스를 통해 간접적으로 주체 클래스를 사용할 수 있도록 한다.
위 그림과 같이 프록시 클래스는 주체 클래스를 감싸면서 클라이언트의 요청을 주체 클래스에게 위임하거나 리다이렉트한다. 프록시 클래스는 주체 클래스의 경량화된 버젼으로 사용되기 때문에 항상 모든 요청을 위임하는 것은 아니며, 보다 실질적인 요청을 주체 클래스에 위임한다.
주체 클래스에게 요청을 위임하기 위해서 프록시는 주체 클래스와 동일한 인터페이스를 구현하여 다형성을 가지게 된다. 이로써 클라이언트는 프록시와 주체 클래스의 인터페이스 타입으로 접근하여 사용할 수 있도록 하며, 클라이언트 측에서는 주체 클래스가 처리하는지 프록시 클래스가 처리하는지 알 수 없다.
프록시 패턴의 특징
- 원래 하려던 기능을 수행하며 그 외의 부가적인 작업(로깅, 인증, 네트워크 통신 등)을 수행할 때 적합하다.
- 비용이 많이 드는 연산(DB 쿼리, 대용량 텍스트 파일 등)을 실제로 필요한 시점에 수행할 수 있도록 한다.
- 사용자 입장에서는 프록시 객체나 실제 객체나 사용법은 유사하다.
프록시가 사용되는 세가지 방법
Virtual Proxy
가상 프록시는 실제 객체의 사용 시점을 제어할 수 있다. 예를 들어, 주체 클래스가 해상도가 매우 높은 이미지를 처리해야 할 경우 많은 메모리를 사용하게 되는데, 이런 이미지들에 동시에 많은 접근이 이루어진다면 시스템에 부하가 많이 가게 될 것이다. 또한 프록시 클래스에서 자잘한 작업들을 처리하고 리소스가 많이 요구되는 작업들이 필요할 때에만 주체 클래스를 사용할 수 있도록 구현할 수 있다.
Protection Proxy
주체 클레스에 대한 접근을 제어하기 위한 경우이다. 프록시 클래스에서 클라이언트가 주체 클래스에 대한 접근을 허용할지 말지 결정하도록 할 수 있다. 어떤 접근권한을 가지고 있는지에 따라 그에 맞는 주체 클래스의 메소드를 호출하도록 구현할 수 있다.
Remote Proxy
프록시 클래스는 로컬에 두고, 주체 클래스는 remote에 위치하는 경우다. Google Docs 같은 것이 대표적인 예시이다. 브라우저는 브라우저대로 필요한 자원을 로컬에 가지고 있고, 또다른 일부 자원은 Google 서버에 있는 형태이다.
정리
- 대리자는 실제 서비스와 같은 이름의 메서드를 구현하며 이 때 인터페이스를 사용한다.
- 대리자는 실제 서비스에 대한 참조 변수를 가진다.
- 대리자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.
- 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수 있다.(인증, 전처리, 암/복호화 등)
프록시 패턴을 정리해보자면, 제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴이라고 할 수 있다. 개방 폐쇄 원칙(OCP)와 의존 역전 원칙(DIP)가 적용된 설계 패턴이다.
참고 자료