코드 저장소.

[디자인 패턴] 프록시 패턴 본문

ComputerScience/디자인 패턴

[디자인 패턴] 프록시 패턴

slown 2024. 5. 21. 02:43

목차

1. 프록시 패턴?

2. 프록시 패턴의 장단점

3. 구현 예제

 

1. 프록시 패턴?

프록시 패턴(Proxy Pattern)은 디자인 패턴 중 하나로, 어떤 객체에 대한 접근을 제어하기 위해 그 객체의 대리인 역할을 하는 객체를 사용하는 패턴입니다. 프록시 패턴은 객체에 대한 접근을 제어하거나 기능을 추가하거나, 리소스를 효율적으로 사용하기 위해 사용됩니다.

2. 프록시 패턴의 장단점

장점

  • 접근 제어 : 클라이언트가 실제 객체에 직접 접근하지 않도록 제어하여 객체의 접근을 관리하고 권한 검사 등을 수행할 수 있다.
  • 지연 초기화 : 실제 객체의 생성 및 초기화를 지연시키는 데 사용하여 필요한 순간만에 생성 및 초기화하여 성능을 최적화할 수 있다.
  • 캐싱 : 결과를 캐싱하여 중복 계산을 피하고 성능을 향상시킬 수 있다.
  • 유효성 검사 : 실제 객체에 접근하기 전에 데이터의 유효성 검사를 통해 검증할 수 있다.
  • 원격 액세스 : 원격 프록시를 사용하여 다른 시스템에서 실행 중인 객체에 접근할 수 있으며 분산 시스템에서 객체 간 통신을 용이하게 한다.

 

단점

  • 복잡성 증가 : 추가적인 객체를 도입하기 때문에 코드의 복잡성이 증가할 수 있다.
  • 성능 저하 : 프록시 객체에 접근하는 데 추가적인 오버헤드가 발생할 수 있으며, 일부 성능 저하가 발생할 수 있다.
  • 디자인 복잡성 : 프록시 패턴을 오용하면 코드를 과도하게 복잡하게 만들 수 있다.

3. 구현 예제

프록시 패턴

 

프록시 패턴은 클라이언트가 접근할 Subject와 이에 대한 구현체인 RealSubject,Proxy가 존재한다. 

 

  • Subject: 프록시와 실제 객체가 구현할 공통 인터페이스.
  • RealSubject: 실제로 동작하는 객체.
  • Proxy: 실제 객체에 대한 접근을 제어하는 객체.

 

프록시 패턴의 예시를 들면 다음과 같습니다. 

// Subject 인터페이스
interface Image {
    void display();
}

// RealSubject 클래스
class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        System.out.println("Loading " + filename);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + filename);
    }
}

// Proxy 클래스
class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

// 클라이언트 코드
public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image = new ProxyImage("test_image.jpg");
        
        // 이미지는 처음 호출 시에만 로드됩니다.
        image.display();
        System.out.println("");
        
        // 이미지는 이미 로드되었으므로 바로 표시됩니다.
        image.display();
    }
}

 

코드를 설명하자면 다음과 같습니다.

  1. Image 인터페이스: RealImage와 ProxyImage가 구현할 공통 인터페이스입니다.
  2. RealImage 클래스: 실제 이미지 객체로, 파일을 디스크에서 로드하고 이미지를 표시합니다.
  3. ProxyImage 클래스: RealImage 객체에 대한 접근을 제어하는 프록시 객체입니다. 이미지가 처음 요청될 때만 RealImage 객체를 생성하고 이후에는 생성된 객체를 사용합니다.
  4. ProxyPatternDemo 클래스: 클라이언트 코드로 ProxyImage를 사용하여 이미지를 표시합니다.

프록시 패턴을 사용하면 객체 생성 비용이 높은 객체에 대한 접근을 효율적으로 제어할 수 있습니다. 이 예제에서는 이미지가 처음 요청될 때만 로드되고, 이후에는 캐싱된 객체를 사용하여 성능을 최적화합니다.

 

출처: https://ittrue.tistory.com/555 [IT is True:티스토리]

'ComputerScience > 디자인 패턴' 카테고리의 다른 글

[디자인 패턴] 데코레이트 패턴  (0) 2024.06.05
[디자인 패턴] 브릿지 패턴  (0) 2024.06.03
[디자인 패턴] 어뎁터 패턴  (0) 2024.05.25
[디자인 패턴] 싱글톤 패턴  (0) 2024.05.16
디자인 패턴  (0) 2024.05.12