디자인패턴 - Proxy 패턴

code_able·1일 전
0

Proxy 패턴이란

프록시(Proxy) 패턴은 어떤 객체에 대한 접근을 제어하는 대리자 객체를 제공하는 구조적 디자인 패턴입니다. 프록시 객체는 실제 객체의 대리 역할을 하며, 클라이언트가 실제 객체에 접근할 때 이를 대신 처리하거나 중간 작업을 수행합니다. 프록시 패턴은 주로 객체 접근을 제어하고, 추가 기능(예: 로깅, 캐싱, 지연 로딩 등)을 추가할 때 유용합니다.

프록시 패턴은 클라이언트가 직접 접근하지 않도록 막아야 하거나, 객체 접근을 추가 로직으로 제어해야 할 때 사용됩니다. 예를 들어, 리소스가 큰 객체의 초기화를 지연시킨다거나, 객체 접근 시 인증을 체크하는 것 등이 프록시 패턴의 주요 사용 예입니다.

프록시 패턴의 종류

프록시 패턴은 다양한 방식으로 구현될 수 있으며, 일반적으로 다음과 같은 종류로 나뉩니다:

  • 가상 프록시(Virtual Proxy): 객체의 초기화가 무겁거나 지연 로딩이 필요한 경우, 필요할 때만 객체를 생성합니다.
  • 원격 프록시(Remote Proxy): 원격 객체에 대한 대리자 역할을 하여 네트워크 상의 객체와의 통신을 처리합니다.
  • 보호 프록시(Protection Proxy): 객체 접근에 대한 권한을 제어합니다.
  • 스마트 프록시(Smart Proxy): 접근 시 추가적인 행동을 수행하는 프록시입니다. (예: 참조 카운팅, 로깅)

장점

  • 지연 로딩을 통해 성능을 최적화할 수 있습니다.
  • 접근 제어와 같은 추가 작업을 객체의 주된 기능에 영향을 주지 않고도 구현할 수 있습니다.
  • 리소스 관리: 사용하지 않는 자원의 초기화를 늦춰 리소스 관리가 용이합니다.

단점

  • 객체를 실제로 사용하기 전에 프록시를 통해 접근하므로 복잡도가 증가할 수 있습니다.
  • 프록시 객체를 관리해야 하므로, 코드가 복잡해질 수 있으며, 디버깅과 유지보수가 어려울 수 있습니다.

예제: Python으로 프록시 패턴 구현하기

아래 예제에서는 프록시 패턴을 사용하여 파일 읽기 작업을 지연 로딩하는 가상 프록시를 구현해 보겠습니다. 실제 파일을 읽는 RealFile 클래스에 접근하기 전에 프록시가 대신 역할을 수행하다가, 진짜 객체가 필요한 경우에만 초기화합니다.

from time import sleep

# RealSubject: 실제 객체 역할을 하는 클래스
class RealFile:
    def __init__(self, filename):
        self.filename = filename
        self.load_file()  # 파일을 실제로 로드하는 작업

    def load_file(self):
        print(f"Loading file '{self.filename}'...")
        sleep(2)  # 파일 로딩 시뮬레이션

    def display_content(self):
        return f"Displaying content of '{self.filename}'"

# Proxy: 실제 객체에 접근을 제어하는 프록시 클래스
class FileProxy:
    def __init__(self, filename):
        self.filename = filename
        self._real_file = None  # 실제 객체를 지연 로딩합니다.

    def display_content(self):
        # 실제 객체를 필요할 때만 초기화
        if self._real_file is None:
            self._real_file = RealFile(self.filename)
        return self._real_file.display_content()

# Client Code
file_proxy = FileProxy("sample.txt")

# 파일을 처음 호출할 때 로드하고 내용을 출력
print(file_proxy.display_content())  
# 두 번째 호출부터는 이미 로드된 파일을 사용
print(file_proxy.display_content())

프록시 패턴의 사용 예

  • 지연 초기화: 무거운 리소스를 사용할 때, 실제로 필요할 때까지 초기화를 지연시킵니다.
  • 액세스 제어: 특정 객체에 대한 접근 권한을 관리하는 경우(예: 인증 및 권한 검사).
  • 네트워크 프록시: 원격 서버나 네트워크 상의 자원에 접근할 때, 네트워크 요청을 프록시가 대신 처리하여 클라이언트가 원격 객체와 상호작용할 수 있게 합니다.
profile
할수 있다! code able
post-custom-banner

0개의 댓글