소프트웨어에 대한 모든 것

[디자인패턴][Proxy] 프록시 패턴 본문

시스템 설계 및 디자인/디자인 패턴

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

앤테바 2022. 3. 24. 14:38
반응형

프록시 패턴 정의

  • 프록시에게 어떤 일을 대신 시키는 것
  • 어떤 객체를 사용할 때 객체를 직접적으로 참조하는 것이 아닌 해당 객체를 대리하는 객체를 통해서 대상 객체에 접근하는 방식. 이는 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 필요한 시점까지 객체의 생성을 미룰 수 있음

프록시 패턴 장점, 단점

장점

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

단점

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

프록시 패턴 특징

  • 대리자는 실제 서비스와 같은 이름의 메소드를 구현
  • 대리자는 실제 서비스에 대한 변수를 갖음
  • 대리자는 실제 서비스와 같은 이름의 메소드를 호출하고 그 결과를 클라이언트에 반환
  • 대리자는 실제 시버스 메소드 호출 전후 별도의 로직 수행 가능

프록시 패턴 왜 사용하는가?

프록시 객체가 클라이언트의 모든 요청을 받아서 실제 객체에 대한 서비스에 대한 접근을 흐름을 제어하면서 서비스를 유연하게 제공할 수 있습니다.

Proxy 적용 전 Proxy 적용 후

 

<출처 - https://refactoring.guru/design-patterns/proxy>

프록시 패턴 종류

가상 프록시

생성하기 힘든 자원에 대한 접근을 제어

 

원격 프록시 

원격 객체에 대한 접근을 제어

 

보호 프록시

접근 권한이 필요한 자원에 대한 접근을 제어

프록시 패턴 클래스 다이어그램

Proxy 패턴 Class Diagram

프록시 패턴 활용 (가상 프록시)

디스크에 접근해서 이미지 파일을 불러오는 예제입니다. RealImage 객체에 집접 접근하지 않고 프록시 객체 ProxyImage를 통해서 RealImage 객체에 접근합니다. RealImage 객체는 생성시 디스크에서 파일을 읽어오는 행위를 하기 때문에 시간이 오래 걸리지만, ProxyImage 객체를 통해서 사용하는 경우 RealImage를 display() 하는 경우(실제 사용 시점)에 디스크에서 이미지를 로드하게 됩니다. 프록시 패턴을 통해서 lazy initialization을 가능케 합니다.

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)
        self.real_image.display()


proxy_image = ProxyImage('hello.png')
proxy_image.display()

참고 자료

https://limkydev.tistory.com/79

https://coding-factory.tistory.com/711

https://today-retrospect.tistory.com/102

https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C%ED%8C%A8%ED%84%B4Proxy-Pattern

 

 

반응형
Comments