[디자인패턴] 프록시 패턴, Proxy Pattern

sunny·2023년 3월 5일
0

디자인 패턴

목록 보기
6/11

프록시 패턴, Proxy Pattern


프록시 패턴이란?

대상 객체(subject)에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 디자인 패턴

  • 프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미
  • 어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조하는 것이 아니라 해당 객체를 대행하는 객체를 통해 대상 객체에 접근하는 방식으로 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고 또한 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있다.

image

프록시 패턴의 장단점

장점

  • 사이즈가 큰 객체가 로딩되기 전에도 프록시를 통해 참조 가능
  • 실제 객체의 public, protected 메소드를 숨기고 인터페이스를 통해 노출 가능
  • 로컬에 있지 않고 떨어져 있는 객체 사용 가능
  • 원래 객체에 접근에 대해 사전처리 가능

단점

  • 객체를 생성할 때 한 단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우 성능이 저하될 수 있다
  • 프록시 내부에서 객체 생성을 위해 스레드가 생성,동기화가 구현되어야 하는 경우 성능이 저하될 수 있다
  • 로직이 난해해져 가독성 떨어질 수 있다

예제 코드

public interface Subject {
    // 리소스가 적게 드는 일
    void action1();
    // 리소스가 많이 드는 일, 네크워크, 메모리
    void action2();
}

public class Proxy implements Subject {

    private Subject real;

    public Proxy(Subject real) {
        this.real = real;
    }

    @Override
    public void action1() {
        System.out.println("간단한 업무 by 프록시");
    }

    @Override
    public void action2() {
        this.real.action2(); // action2는 복잡하기 때문에 proxy가 할 수 없다
    }
}

public class RealSubject implements Subject {

    @Override
    public void action1() {
        System.out.println("간단한 업무 by 실제");
    }

    @Override
    public void action2() {
        System.out.println("복잡한 업무 by 실제");
    }
}

public class Demo {
    public static void main(String[] args) {
        Subject real = new RealSubject();
        Subject proxy1 = new Proxy(real);
        Subject proxy2 = new Proxy(real);

        proxy1.action1();
        proxy2.action1();

        proxy1.action2();
        proxy2.action2();
    }
}

/*
간단한 업무 by 프록시
간단한 업무 by 프록시
복잡한 업무 by 실제
복잡한 업무 by 실제
*
* */

참고 자료

0개의 댓글

관련 채용 정보