프록시(Proxy) 패턴은 어떤 객체에 대한 접근을 제어하는 대리자 객체를 제공하는 구조적 디자인 패턴입니다. 프록시 객체는 실제 객체의 대리 역할을 하며, 클라이언트가 실제 객체에 접근할 때 이를 대신 처리하거나 중간 작업을 수행합니다. 프록시 패턴은 주로 객체 접근을 제어하고, 추가 기능(예: 로깅, 캐싱, 지연 로딩 등)을 추가할 때 유용합니다.
프록시 패턴은 클라이언트가 직접 접근하지 않도록 막아야 하거나, 객체 접근을 추가 로직으로 제어해야 할 때 사용됩니다. 예를 들어, 리소스가 큰 객체의 초기화를 지연시킨다거나, 객체 접근 시 인증을 체크하는 것 등이 프록시 패턴의 주요 사용 예입니다.
프록시 패턴은 다양한 방식으로 구현될 수 있으며, 일반적으로 다음과 같은 종류로 나뉩니다:
아래 예제에서는 프록시 패턴을 사용하여 파일 읽기 작업을 지연 로딩하는 가상 프록시를 구현해 보겠습니다. 실제 파일을 읽는 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())