본문 바로가기
Programming

[Java] 프록시 패턴(Proxy Pattern)이란?

by BTC_젤리요정 2023. 10. 13.

안녕하세요, BTC 블랙아웃입니다!

오늘은 디자인 패턴 중 하나인 '프록시 패턴'에 대해서 함께 알아보겠습니다.

프록시 패턴은 이름에서도 알 수 있듯이 '대리인'의 역할을 하는 패턴입니다. 언제, 왜 이 패턴이 필요한지, 그리고 어떤 종류의 프록시 패턴이 있는지 한 번 살펴보겠습니다.


1. 프록시 패턴이란?

프록시 패턴은 어떤 객체에 대한 접근을 제어하는 역할을 합니다. 대상 객체에 직접 접근하는 대신 프록시 객체를 통해 접근하게 되는데, 이로 인해 다양한 작업을 추가로 수행할 수 있습니다.

 

2. 프록시 패턴의 종류

1) 가상 프록시 (Virtual Proxy)

특징: 실제 객체의 생성이 자원을 많이 소모하는 경우, 실제 필요한 시점에 객체를 생성합니다.

예시: 이미지 뷰어 앱에서 큰 이미지를 로딩할 때, 사용자가 실제로 이미지를 클릭하기 전까지는 썸네일만을 보여주고, 클릭 시 실제 큰 이미지를 로딩하는 방식.

2) 보호 프록시 (Protection Proxy)

특징: 객체에 대한 접근 권한을 체크하여, 특정 사용자만이 해당 객체에 접근할 수 있도록 합니다.

예시: 웹 사이트의 VIP 회원 전용 콘텐츠. VIP 회원이 아닌 사용자가 접근하려 할 때 프록시가 접근을 차단합니다.

 

3. 프록시 패턴 생성 예시

이 예제는 크기가 큰 이미지 파일을 다룰 때, 사용하는 예시입니다.

대용량 이미지 파일을 로딩하는 대신 작은 썸네일 이미지를 먼저 보여주고, 사용자가 원하는 이미지를 선택해 클릭할 때만 실제 이미지를 로딩하는 방식입니다.

// Image 인터페이스 정의
public interface Image {
    void display();
}

// RealImage 클래스: 실제 이미지 로딩 및 표시
public class RealImage implements Image {
    private String filename;
    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }
    private void loadFromDisk() {
        System.out.println("Loading " + filename);
    }
    @Override
    public void display() {
        System.out.println("Displaying " + filename);
    }
}

// ProxyImage 클래스: RealImage의 프록시
public 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.jpg");
        image.display();  // 이미지 로딩 및 표시
        image.display();  // 이미 로딩된 이미지 표시
    }
}
  1. Image 인터페이스
    먼저, 실제 객체와 프록시 객체가 공통으로 구현할 Image 인터페이스를 정의합니다.
  2. RealImage 클래스 (실제 객체)
    Image 인터페이스를 구현하는 실제 객체인 RealImage 클래스를 만듭니다.
  3. ProxyImage 클래스 (프록시 객체)
    실제 RealImage 객체의 생성을 지연시키는 프록시 객체인 ProxyImage 클래스를 구현합니다.
  4. 메인 클래스
    마지막으로, 프록시 패턴을 테스트하기 위한 메인 클래스를 작성합니다.

 

4. 프록시 패턴의 장점

  • 접근 제어: 객체에 대한 접근을 세밀하게 제어할 수 있습니다.
  • 지연 초기화: 실제 객체의 생성 시점을 늦출 수 있어, 성능 최적화에 도움이 됩니다.
  • 참조 카운트: 실제 객체에 대한 참조 횟수를 계산하는데 사용될 수 있습니다.

5. 결론

프록시 패턴은 객체의 생성과 접근을 제어하는 역할을 합니다.

예제에서 보았듯이, 실제로 무거운 연산이 필요한 RealImage의 생성을 지연시켜 리소스를 효율적으로 관리했습니다. 프록시 패턴을 잘 활용하면 시스템의 성능을 최적화하고, 필요한 작업만을 수행하여 리소스 낭비를 줄일 수 있습니다.

이상으로 프록시 패턴에 대한 포스팅을 마치겠습니다.

댓글