문제 및 이론 정리/디자인패턴

[디자인패턴] Proxy - 필요해지면 만든다

hail2y 2025. 2. 22. 00:56

책 [JAVA 언어로 배우는 디자인 패턴 입문 3판;유키 히로시 저]을 참고하여 작성하였습니다. 

 

본인 객체를 대신해서 대리인 객체가 일을 대신 처리

대신 대리인 객체가 할 수 없는 일일 때 본인 객체를 생성

→ 초기화에 시간이 오래 걸리는 시스템이라면 대리인을 사용하여 작업 처리 속도를 올릴 수 있다, 유지보수 용이

 

Subject 본인, Proxy와 RealSubject를 동일시하기 위한 인터페이스(API), 공통 인터페이스

 

Proxy 대리인, Subject 인터페이스 구현

- client 요청을 최대한 처리하는데 자기 혼자 처리할 수 없다면 RealSubject에게 맡긴다. 

- 이때서야 RealSubject 인스턴스를 생성한다.

 

RealSubject 실제 본인, Subject 인터페이스 구현

- Proxy만으로 감당할 수 없는 일일 때 등장

- 실제 본인 객체는 Proxy의 존재를 모른다

 

public class PrinterProxy implements Printable {
    private String name;
    private Printer real; // 본인 객체 포함
    
    public PrinterProxy() {
        this.name = "No Name";
        this.real = null;
    }
    
    public PrinterProxy(String name) {
        this.name = name;
        this.real = null; // 이때도 본인 객체는 생성되지 않음
    }
    
    @Override
    public synchronized void setPrinterName(String name) {
        if(real != null) {
            real.setPrinterName(name);
        }
        this.name = name;
    }
    
    @Override
    public String getPrinterName() {
        return this.name;
    }
    
    @Override
    public void print(String string) {
        realize();
        real.print(string); // 본인 객체에게 위임
    }
    
    private synchronized void realize() {
        if(real == null) {
            real = new Printer(name);
        }
    }
}

 

프록시 종류

  • HTTP 프록시 - HTTP 서버와 HTTP 클라이언트 사이에서 웹 페이지 캐싱 등을 하는 소프트웨어
  • Virtual Proxy(가상 프록시) - 실제로 인스턴스가 필요한 시점에서 생성 및 초기화
  • Remote Proxy(원격 프록시) - RealSubject가 네트워크 저편에 있음에도 불구하고 마치 자기 옆에 있는 것처럼 메서드 호출 가능 (ex. Java RMI - Remote Method Invocation; 원격 메서드 호출)
  • Access Proxy(보호 프록시) - RealSubject 역의 기능에 대해 접근 제한을 설정, 즉 허락된 사용자만 접근 가능하도록

 

 

cf. Decorator, Proxy 패턴 모두 투과적인 인터페이스를 사용하고 있지만, 두 패턴의 목적이 다르다.

Decorator Proxy
새로운 기능 추가 본인의 작업을 위임하여 본인에 대한 액세스를 줄인다