슬기로운 개발생활

[Design Pattern] 프록시 패턴(Proxy Pattern) 알아보기

by coco3o
반응형

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

프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미이다.
일종의 비서라고 생각하면 된다.사장실에 바로 들어가서 사장님을 바로 만나는게 아닌 비서를 통해 사장님을 만나는 개념이라고 생각할 수 있겠다.

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

https://m.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8616098823

일반적으로 프록시는 다른 무언가와 이어지는 인터페이스 역할을 하는 클래스를 의미한다.

프록시 패턴(Proxy Pattern)을 사용하는 이유가 뭘까?

  • 객체지향 5원칙 중 하나인 OCP를 지킬 수 있다.
    • 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다.
  • 객체지향 5원칙 중 하나인 SRP를 지킬 수 있다.
    • 기존 코드가 해야 하는 일만 유지할 수 있다.
  • 유연한 코드를 만들 수 있다.
    • (객체)초기화 지연 및 기능 추가(로깅, 시간 측정, 캐싱), 흐름제어 등으로 다양하게 활용할 수 있다.

프록시 패턴(Proxy Pattern) 간단 예제

위 그림을 예로 간단한 예제를 만들어보자.

public interface Subject {
    void request();
}
public class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("HelloCoCoWorld!");
    }
}
public class Proxy implements Subject {

    private Subject subject;

    @Override
    public void request() {
        // 객체의 초기화를 지연시켜 실제로 사용될 때 생성함으로써 메모리 절약 가능
        if (this.subject == null) {
            this.subject = new RealSubject();
        }

        subject.request(); // 프록시가 RealSubject()의 메소드를 호출한다.
    }
}
public class Main {
    public static void main(String[] args) {
        // RealSubject 클래스의 메소드를 호출하는것이 아닌 Proxy 클래스의 메소드를 호출한다.
        Subject subject = new Proxy();
        subject.request(); // 내부적으로 RealSubject의 메소드를 호출한다.
    }
}

Main에서 RealSubject에 직접 접근하지 않고 Proxy를 생성하여 대신 시킨다.

프록시 패턴(Proxy Pattern)의 장단점

프록시 패턴 장점

  • 기존 객체를 수정하지 않고 일련의 로직을 프록시 패턴을 통해 추가할 수 있다.
  • 실제 객체를 수행하기 이전에 전처리를 하거나, 기존 객체를 캐싱할 수 있다. 
    • 기존 객체의 리소스가 무거울 경우, 이러한 캐싱 과정을 통해 부하를 줄일 수 있는 장점이 있다.
  • 기존 객체와 클라이언트의 요청 사이에 위치해 있기 때문에 하나의 방패(보안) 역할을 한다.

프록시 패턴 단점

  • 코드의 복잡도가 증가한다. 
    • 로직이 난해해져 가독성이 떨어질 수 있다.
  • 성능이 저하될 수 있다.
    • 객체를 생성할 때 한 단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우
    • 객체 생성을 위해 스레드 생성 및 동기화가 구현되어야 하는 경우



반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기