728x90

어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 개체를 제공하는 패턴을 프록시 패턴이라고 한다.


사용하게 되는 곳은 기존 인터페이스의 형태를 변경하지 않고 원형 클래스의 행동을 변경할 때 유용하게 사용된다. 특히 원형 클래스가 서드 파티 라이브러리인 경우 직접적인 변경이 어렵기 때문에 프록시 패턴이 더욱 유용하다.


프록시 패턴의 UML다이어그램은 다음과 같이 그려질 것이다.


아마도 기본적인 Proxy Pattern을 적용하면 이런 형태가 될 것이다.


다른 방법으로 Proxy Pattern을 적용하려면 프록시와 원형 API가 함께 사용하는 추상 인터페이스를 통해 이런 접근 방식을 늘리는 것인데, 이 경우 비록 원형 API를 변경할 상황이 발생한다 해도 두 API를 계속해서 동기화 시킬 수 있다.




이 패턴을 사용했을 때의 장점은 다음과 같다.

 - 원형 객체의 지연된 인스턴스 구현 : 이 경우 원형 객체는 실제로 메서드 호출이 발생하기 전까지 인스턴스화되지 않는다. 

원형 객체의 인스턴스가 많은 메모리를 차지하는 경우라면 지연된 인스턴스 생성이 절대적으로 필요하다.


 - 원경 객체의 접근 제어 구현 : 예를 들어, 올바른 권한을 가진 사용자만이 원형 객체의 특정 메서드를 호출할 수 있는 기능을 구현하기  위해 원형 객체와 프록시 사이에 권한 계층을 두고 접근을 제어한다.


 - 디버그 또는 드라이런 모드 지원 : 프록시 내에서 원형 객체를 호출하는 모든 메서드의 실행 코드를 디버깅하거나, 예를 들어 객체의 상태를 더 이상 저장하지 않도록 행동을 변경하는 것처럼 프록시 내에서 원형 객체의 특정 메서드에 어떤 값을 전달하지 않는 드라이 런 테스트를 진행할 수 있다.


 - 스레드에 안전한 원형 객체 지원 : 뮤텍스 락을 추가시켜 메서드가 스레드에 안전하도록 만들 수 있다.


 - 자원 공유 지원 : 같은 원형 객체를 사용하는 여러 개의 프록시 객체를 사용할 수 있다. 여러 개의 객체가 동일한 데이터를 공유하여 메모리 공간을 최소화 시킨다.


 - 원형 객체의 향후 변경으로부터 보호 : 현재 사용 중인 라이브러리가 향 후 변경될 것을 예상하고 프록시를 생성해서 현재 라이브러리의 동작을 그대로 옮겨 패턴을 구현한다. 그리고 예상대로 라이브러리가 변경이 되면 프록시 객체를 통해 기존의 인터페이스는 그대로 유지하고 새로운 라이브러리의 메서드를 사용하기 위한 구현 부분을 변경하며, 이때는 자연스럽게 어댑터 패턴을 사용한다.

728x90

+ Recent posts