반응형

 

안녕하세요 취업길잡이 Coy입니다

오늘은 프록시패턴에 대해서 알아보도록 하겠습니다

프록시패턴이란?

프록시 패턴은 대상 객체에 대한 접근을 제어하여 추가적인 기능을 제공하는 구조 디자인 패턴입니다. 클라이언트가 대상 객체에 직접 접근하는 대신 프록시 객체를 통해 접근하며, 이를 통해 보안, 캐싱, 데이터 유효성 검사, 지연 초기화, 로깅 등의 기능을 추가할 수 있습니다. 프록시는 대상 객체와 동일한 인터페이스를 구현하여 클라이언트에게 투명하게 동작하며, 객체 생성 비용이 비싼 경우나 원격 객체를 로컬처럼 다룰 때 유용합니다.

 

사용하는 목적

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

 

 

구조

 

 

예제코드

interface Image {
    void display();
}

class RealImage implements Image {
    private String filename;

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

    private void loadFromDisk() {
        System.out.println("Loading image: " + filename);
    }

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

 

class ProxyImage implements Image {
    private String filename;
    private RealImage realImage;

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

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

 

public class ProxyPatternExample {
    public static void main(String[] args) {
        // Client accesses the image through proxy
        Image image1 = new ProxyImage("image1.jpg");
        Image image2 = new ProxyImage("image2.jpg");

        // Image1 will be loaded from disk
        image1.display();
        // Image1 will not be loaded again, as it's already in memory
        image1.display();

        // Image2 will be loaded from disk
        image2.display();
        // Image2 will not be loaded again, as it's already in memory
        image2.display();
    }
}

 

Image 인터페이스

- 이미지를 표현하기 위한 인터페이스입니다.

- display() 메서드를 정의하여 이미지를 표시하는 기능을 가지고 있습니다.

 

RealImage 클래스

- Image 인터페이스를 구현한 실제 이미지를 로딩하는 클래스입니다.

- 생성자에서 파일 이름을 받아와서 해당 이미지를 디스크에서 로드합니다.

- display() 메서드를 구현하여 이미지를 표시합니다.

 

ProxyImage 클래스

- Image 인터페이스를 구현한 프록시 이미지 클래스입니다.

- 필요한 경우에만 실제 이미지를 로드하고 표시하는 기능을 가지고 있습니다.

- display() 메서드를 구현하여 이미지를 표시하기 전에 실제 이미지를 로드하고 표시합니다.

 

ProxyPatternExample 클래스

- 클라이언트 코드를 포함한 예제의 진입점입니다.

- 프록시 패턴을 사용하여 이미지를 표시하는 예시를 보여줍니다.

- 클라이언트는 ProxyImage를 통해 이미지에 접근하고 표시합니다. 이미지가 필요할 때마다 실제 이미지를 로드하여 표시합니다.

 

 

장단점

장점

1. 기존 객체 수정 없이 기능 추가: 기존 객체를 수정하지 않고도 프록시 패턴을 통해 일련의 로직을 추가할 수 있습니다. 이를 통해 기능 확장이 용이해집니다.
2. 리소스 관리 및 부하 감소: 실제 객체를 수행하기 이전에 전처리를 하거나, 기존 객체를 캐싱하여 부하를 줄일 수 있습니다. 특히, 기존 객체의 리소스가 무거울 경우 캐싱 과정을 통해 부하를 줄일 수 있습니다.
3. 보안: 프록시는 기존 객체와 클라이언트 요청 사이에 위치하여 보안 역할을 하게 됩니다. 클라이언트가 직접적으로 기존 객체에 접근하지 않고 프록시를 통해 접근하기 때문에 보안 측면에서 유리합니다.

단점

1. 코드 복잡도 증가: 프록시를 도입함으로써 코드의 복잡도가 증가할 수 있습니다. 프록시를 통해 추가된 로직이나 중개 역할 때문에 코드가 난해해져 가독성이 떨어질 수 있습니다.
2. 성능 저하 가능성: 객체를 생성할 때 프록시를 거치므로, 객체 생성 및 호출에 대한 오버헤드가 발생할 수 있습니다. 특히, 빈번한 객체 생성이 필요한 경우 성능 저하가 발생할 수 있습니다.
3. 동기화 및 스레드 관리 필요성: 객체 생성을 위해 스레드 생성 및 동기화가 필요할 수 있습니다. 이로 인해 코드의 복잡성이 증가할 수 있으며, 올바른 스레드 관리가 필요합니다.

 

 

오늘은 프록시 패턴에 대해서 알아보았습니다

 

컬럼으로 다루어 주면 좋겠다 싶은 주제가 있으면 댓글로 알려주세요

 

도움이 필요하시면 사연을 메일로 보내주세요

 

jek300300@gmail.com

 

도움이 되셨다면 공감과 구독 부탁드립니다

 

읽어주셔서 감사합니다

 

당신의 취업이 성공할 때까지 같이 하겠습니다! by 취업길잡이 Coy

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기