Design Pattern/Structural

[Python] Proxy Pattern (프록시 패턴)

by_Exist 2020. 10. 9. 18:25

https://refactoring.guru/design-patterns/proxy

Proxy Pattern이란?

  • 특정 타 객체로 접근하는 것을 통제하기 위해 해당 객체의 대리자 또는 자리채움자를 제공하는 패턴.
  • 인터페이스를 변경하지 않으면서 기능을 추가하기 위해 사용되는 패턴.

예제

# RealSubject의 do_the_job의 기능으로 불만족스럽다.
# RealSubject를 수정하지 않으면서 기능을 추가하고 싶다.
class RealSubject:

    def do_the_job(self, user: str) -> None:
        print(f"{user}(이)가 작업을 수행합니다.")


# 동일한 인터페이스를 지닌 클래스를 선언하여 (ABC를 선언하여 상속해도 되겠다.)
class Proxy:

    def __init__(self) -> None:
        # has 관계로 소유하여
        self._real_subject = RealSubject()

    # 기능을 확장한다. (로깅, 캐싱, 권한 핸들링...)
    def do_the_job(self, user: str) -> None:
        print(f"[log] {user}의 작업 수행을 감지했습니다.")
        if user == "admin":
            self._real_subject.do_the_job(user)
        else:
            print("[log] `admins`이 아닌 유저는 작업을 수행할 수 없습니다.")


def main():

    real_subject = RealSubject()
    real_subject.do_the_job('admin')
    real_subject.do_the_job('anonymous')
    # admin(이)가 작업을 수행합니다.
    # anonymous(이)가 작업을 수행합니다.

    proxy = Proxy()
    proxy.do_the_job('admin')
    proxy.do_the_job('anonymous')
    # [log] admin의 작업 수행을 감지했습니다.
    # admin(이)가 작업을 수행합니다.
    # [log] anonymous의 작업 수행을 감지했습니다.
    # [log] `admins`이 아닌 유저는 작업을 수행할 수 없습니다.


if __name__ == "__main__":
    main()

여담

  • Proxy 패턴과 Decorator 패턴의 차이점
    • Proxy는 인터페이스를 고정하며, Decorator는 인터페이스를 변경할 수 있다.
    • 정적 언어에서는 해당 패턴이 정의되는 시점이 다르다고 한다. 컴파일(Proxy), 런타임(Decorator).
    • Proxy 패턴은 객체 접근의 제어를 목적으로 하며, Decorator는 기능의 추가를 목적으로 한다.
  • 클라이언트 코드 수정 없이 기존 객체에 추가 동작을 구현할 경우에 사용될 수 있겠다.