프록시 패턴 Proxy Pattern

지현·2023년 2월 7일
0

디자인 패턴

목록 보기
2/2

프록시 패턴

Proxy : 대리인, 대용물

영단어 Proxy의 의미처럼 프록시 패턴은 무언가를 대신 처리해주는 역할이라고 이해하면 된다!

💡 어떤 객체를 사용하려고 할 때, 객체를 직접적으로 참조 하는 것이 아니라 그 객체를 대신(proxy)하는 객체를 통해 접근하는 방식

대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴
→ 프록시에게 어떤 일을 대신 시키는 것


프록시 패턴의 종류

가상 프록시 (Virtual Proxy)

  • 생성하는데 많은 비용이 드는 객체를 대신하는 역할
  • 실제 객체 기능이 반드시 필요한 시점까지 객체 생성 미룰 수 있다
  • 객체 생성 전이나 도중에 대신하기도 함
# ex. 해상도가 아주 높은 이미지 처리해야하는 경우
# 실제로 이미지를 display 할 때만 RealImage 사용하도록 구현

import time
from abc import ABC, abstractmethod


class Image(ABC):
    def __init__(self):
        self.filename = None

    @abstractmethod
    def display(self):
        pass


class RealImage(Image):
    def __init__(self, filename):
        self.filename = filename
        self.load_from_disk()
        # 생성 시 디스크에서 파일 로드해옴 → 오래 걸림!

    def load_from_disk(self):
        print(f'loading {self.filename}')
        time.sleep(1000)

    def display(self):
        print(f'displaying {self.filename}')


class ProxyImage(Image):
    def __init__(self, filename):
        self.filename = filename
        self.real_image = None

    def display(self):
        if self.real_image is None:
            self.real_image = RealImage(self.filename) 
            # RealImage에 직접 접근하지 않고 ProxyImage 통해 접근
        self.real_image.display()


proxy_image = ProxyImage('hello.png')
proxy_image.display()
# 실제 사용 시점에서 이미지 로드

원격 프록시

  • 네트워크와 연결된 상황에서 원격으로 로컬 객체를 원격 객체처럼 사용할 수 있게 한다
  • ex. Google Docs
    - 브라우저에서 필요한 자원은 로컬에서 가지고 있고, 또 다른 자원은 Google 서버에 위치

보호 프록시

  • 주체 클래스에 대한 접근 제어, 객체에 대한 접근 권한 제어, 객체마다 접근 권한을 다르게 하고 싶을 때 사용
  • 프록시 클래스에서 클라이언트에 주체 클래스에 대한 접근 허용 여부를 결정할 수 있다

프록시 패턴의 특징과 장단점

특징

  • 객체가 메모리에 존재하지 않아도 기본적인 정보 참조, 설정 가능!
  • 실제 객체 기능이 반드시 필요한 시점까지 객체 생성 미룰 수 있다
  • 객체의 속성, 변환을 보완
  • 보안, 데이터 검증, 캐싱, 로깅에 사용

장점

  • 메모리 사용량이 큰 객체가 로딩 전에 프록시를 통해서 참조 가능
  • 로컬에 있지 않고 떨어져 있는 객체 사용 가능
  • 원래 객체의 접근에 대해서 사전처리 작업 가능

단점

  • 객체 생성에 한 단계를 거치므로 빈번한 객체 생성이 필요한 경우 성능 저하 발생 가능
  • 코드 가독성 저하

Reference
[Design Pattern] 프록시 패턴(Proxy Pattern)에 대하여
[디자인패턴][Proxy] 프록시 패턴
파이썬으로 작성된 프록시

profile
제로부터 시작하는 개발자 생활 (⑅´•⌔•`)

0개의 댓글