Skip to main content

Proxy Pattern

View all Design Patterns

객체에 대한 접근을 제어하거나 추가적인 기능을 제공하기 위한 방법이다.


Class Diagram

Abstract overview

위와 같이 Service 클래스는 Proxy 클래스의 생명주기를 따르게 되며, 클라이언트 코드는 ServiceInterface에 의존하게 된다.

Concrete example


Code

interface Image {
displayImage(): void;
}

class RealImage implements Image {
private filename: string;

constructor(filename: string) {
this.filename = filename;
this.loadImageFromDisk();
}

private loadImageFromDisk() {
console.log(`Loading ${this.filename}`);
}

displayImage() {
console.log(`Displaying ${this.filename}`);
}
}

class ProxyImage implements Image {
private realImage: RealImage | null = null;
private filename: string;

constructor(filename: string) {
this.filename = filename;
}

displayImage(): void {
if (this.realImage === null) {
this.realImage = new RealImage(this.filename);
}
this.realImage.displayImage();
}
}

const imageA: Image = new ProxyImage("testA.jpg");
const imageB: Image = new ProxyImage("testB.jpg");

imageA.displayImage();
// Loading testA.jpg
// Displaying testA.jpg
imageB.displayImage();
// Loading testB.jpg
// Displaying testB.jpg

이때, ProxyImage 클래스는 기존의 Image 클래스를 구현하고 있고, RealImage 인스턴스를 내부적으로 만들어, 실제 이미지를 로드하는 작업을 위임받게 된다.


Pros and Cons

Pros

  • Lazy initialization(지연 초기화)로 대상 객체의 생성을 지연시킬 수 있다. 객체가 실제로 필요할 때만 생성되기 때문에, 자원을 효율적으로 사용할 수 있다.
  • 클래스가 인터페이스를 구현하기만 하면 클라이언트는 해당 클래스의 인스턴스가 프록시를 통해 생성됐는지 몰라도 된다.

Cons

  • 프록시를 추가하면, 처리해야 할 계층이 하나 더 늘어나기 때문에, 응답 속도가 지연될 수 있다.
  • 디버깅이 어려워질 수 있다.
Related Links