프록시 패턴(Proxy Pattern)은 디자인 패턴 중 구조 패턴의 하나로, 객체의 대리인(proxy) 역할을 하는 객체를 통해 다른 객체에 접근하는 방법을 제공하는 패턴입니다. 이 패턴은 접근 제어, 리소스 관리, 로깅, 캐싱, 지연 초기화 등의 다양한 목적으로 사용됩니다.
주요 개념
- 실제 객체(Real Subject):
- 실제로 작업을 수행하는 객체입니다. 클라이언트가 원래 접근하려는 대상입니다.
- 프록시(Proxy) 객체:
- 실제 객체에 대한 접근을 제어하는 대리 객체입니다. 프록시는 클라이언트와 실제 객체 사이에서 중개 역할을 하며, 실제 객체의 메소드 호출을 제어하거나 추가 기능을 수행할 수 있습니다.
- 인터페이스(Subject Interface):
- 실제 객체와 프록시 객체가 공통적으로 구현하는 인터페이스입니다. 클라이언트는 인터페이스를 통해 실제 객체나 프록시 객체를 동일하게 사용할 수 있습니다.
사용 예시
- 가상 프록시(Virtual Proxy):
- 리소스가 무거운 객체의 생성과 초기화를 지연시켜 필요할 때만 생성하는 방식입니다. 예를 들어, 대형 이미지 파일을 로드할 때 가상 프록시를 사용해 실제 이미지 로드를 지연시킬 수 있습니다.
- 보안 프록시(Protection Proxy):
- 실제 객체에 대한 접근 권한을 제어하는 역할을 합니다. 예를 들어, 사용자 권한에 따라 특정 작업을 제한할 수 있습니다.
- 원격 프록시(Remote Proxy):
- 실제 객체가 네트워크를 통해 원격 서버에 있을 때 사용됩니다. 클라이언트는 원격 프록시를 통해 원격 객체에 접근할 수 있습니다.
- 스마트 프록시(Smart Proxy):
- 실제 객체에 접근할 때 추가적인 행동(로깅, 참조 카운팅, 캐싱 등)을 수행하는 프록시입니다.
장점
- 접근 제어: 프록시 객체를 통해 실제 객체에 대한 접근을 제어하고, 보안이나 권한 관리를 할 수 있습니다.
- 성능 최적화: 리소스가 무거운 객체의 생성을 지연시키거나 캐싱을 통해 성능을 최적화할 수 있습니다.
- 유연성: 프록시를 사용해 실제 객체의 동작을 수정하지 않고도 다양한 기능을 추가할 수 있습니다.
단점
- 추가 복잡성: 프록시 객체를 추가함으로써 코드의 복잡성이 증가할 수 있습니다.
- 성능 오버헤드: 프록시 객체가 실제 객체와 클라이언트 사이에 중간 계층을 추가하므로, 성능에 약간의 오버헤드가 발생할 수 있습니다.
프록시 패턴은 실제 객체에 대한 접근을 통제하거나 최적화가 필요할 때 유용하게 사용되는 패턴입니다.

- Forward Proxy, Reverse Proxy

1. 프록시 패턴 연습 예제 및 해설
App
package ex02;
/**
* Animal 생성 (abstract)
* 타입 일치(다형성) = 쥐(동물), 호랑이(동물)
* 문지기한테 DIP만 지켜주면 됨
*/
public class App {
public static void main(String[] args) {
Mouse m = new Mouse(); //->mouse animal
DoormanProxy doormanProxy = new DoormanProxy(new Doorman());
doormanProxy.쫒아내(m);
}
}
- ‘Mouse’ 는 ‘Animal’을 상속 받아 ‘쫓아내’ 메소드를 구현한 클래스다.
- ‘Doorman’은 ‘Animal’ 타입 객체를 처리하는 클래스이다.
- ‘DoormanProxy’는 ‘Doorman’ 객체를 감싸는 Proxy 클래스이다.
- ‘Doorman’ 의 기능을 대신 호출한다.
☆DoormanProxy
package ex02;
public class DoormanProxy{
private Doorman doorman;
public DoormanProxy(Doorman doorman) {
this.doorman = doorman;
}
public void 쫒아내(Animal a){
System.out.println("안녕~~~");
doorman.쫒아내(a);
}
}
- ‘Doorman’ 객체를 감싸는 Proxy클래스다.
- ‘DoormanProxy’는 ‘Doomman’의 메소드를 호출하기 전에 ‘ “안녕~~”’이라는 메세지를 출력한다.
- 그리고 ‘Doorman’ 객체의 ‘쫓아내’ 메소드를 호출하여 실제 동작을 수행한다.
- Proxy클래스는 ‘Doorman’의 기능을 간접적으로 호출할 수 있게 하여, 호출 전후 추가적인 동작을 수행 할 수 있게 한다. 이를 통해 ‘Doorman’의 기능을 제어하고 확장 할 수 있다.
Share article