디자인패턴

[디자인패턴] - 프록시 패턴 (Proxy Pattern)

KimGeon-U 2025. 2. 7. 19:31

프록시 패턴 (Proxy Pattern)

프록시 패턴은 대상 원본 객체에 대한 접근을 제어하기 위해 대리 객체를 제공하는 디자인 패턴입니다.

대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름 제어 및 추가적인 로직을 처리 한 뒤 접근 할 수 있습니다.

 

※ GoF 디자인 패턴에서는 접근 제어를 목적으로 구현한 경우 프록시 패턴,

※ 새로운 기능 추가(로깅, 데이터 검증 등)가 목적인 경우 데코레이터 패턴으로 분류합니다.

 

프록시 패턴 - https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%ED%8C%A8%ED%84%B4

 

프록시 정의 및 특징

  • Client -> Server 호출시 직접호출 하는것이 아닌, 어떠한 대리자를 통해서 간접적으로 Server에 요청하는 것
    • Client -> Proxy -> Server
    • 간접 호출하는 대상을 프록시 라고 한다.
  • 권한에 따른 접근 차단, 캐싱, 지연 로딩을 수행하는 접근제어
    • bool Access를 통한 접근제어
    • 인스턴스 하려는 객체가 너무 크거나 메모리를 많이 차지하는 경우 필요할 때만 객체를 생성하여 성능 최적화
  • 기존 객체에서 다른 기능까지 추가해주는 부가기능 추가
    • 데이터 유효성 검사(Data Validation) / 로깅(Logiing) 등
  • 원격 위치에 있는 객체를 가져와 로컬처럼 보이게 하는 원격 프록시
    • UE의 네트워크 리플리케이션 RPC는 프록시 기반으로 구현되어 있다.

 

 

프록시 패턴 구조

  • Subject : 프록시와 대상 객체를 하나로 묶는 인터페이스
    • 대상 객체와 프록시 역할을 동일하게 해주는 virtual 함수 DoAction() 정의
    • 인터페이스를 통해 클라이언트는 객체 호출시에도 다형성을 통해 ISubject를 호출하면 된다.
  • RealSubject : 원본 대상 객체
  • Client : ISubject를 상속한 프록시 객체를 생성해 호출
    • 클라이언트는 실제 객체 사이에 프록시를 두어 RealSubject와 데이터를 주고받는다.
  • Proxy : 대상 객체를 중계할 대리자 역할.
    • 대상 객체를 합성한다.
    • 가상함수 DoAction()을 호출하여 RealSubject의 DoAction()외 부가적인 로직을 수행 할 수 있다.
    • 흐름 제어를 하며, 결과 값을 조작하거나 변경시키지 않는다.

 

프록시 패턴 종류

가상 프록시 (Virtual Proxy)

 

원격 프록시 (Remote Proxy)

  • 프록시 클래스는 로컬에 있으며, 대상 객체는 원격 서버에 존재하는 경우
    • 언리얼의 리플리케이션(Replication) 시스템은 서버/클라이언트 간 프록시 객체를 사용한 원격 객체 대리 실행
    • https://mynameiskgws.tistory.com/38
  // Replication  
  // Server : 서버에서 실행되어야 하는 함수. 클라이언트에서 호출되더라도 자동으로 서버에서 실행
  // Client : 서버가 클라이언트에게 정보 전송시.
  // Reliable : 손실시 패킷을 재전송하여 데이터 손실 방지
  // WithValidation : 서버에서 요청을 받기 전에 유효성 검사를 한다. (프록시 특징인 부가기능. 데이터 유효성 검사)
  UFUNCTION(Server, Reliable, WithValidation)
  void Server_Func();
  
  
  void AActor::Server_Func_Implementation()
  {
    // 실제 서버에서 실행되는 로직
    // ...
  }
  
  bool AActor::Server_Func_Validation()
  {
    // WithValidation 사용시
    // 프록시 패턴을 통해 전송되는 로직에 대한 추가기능(데이터 유효성 검사) 에 대한 로직...
    return true/false;
  }

 

보호 프록시 (Protection Proxy)

  • 프록시가 대상 객체에 대한 자원으로의 액세스 제어 (접근 제한)
    • WithValidation을 사용하여 Func에 대한 로직 실행 전, Validation 함수를 통한 접근 제한
    • 엔진 내부적으로 IsServer, Server_Func_Validate()에 대한 조건이 true인 경우 동작하도록 구현되어 있다.
  • 특정 클라이언트만 서비스 객체를 사용할 수 있도록 하는 경우 
    • Ex) 특정 액터/UI에 대한 접근권한을 특정 플레이어에만 조작하도록 제한하는 경우