프록시 패턴 (Proxy Pattern)
프록시 패턴은 대상 원본 객체에 대한 접근을 제어하기 위해 대리 객체를 제공하는 디자인 패턴입니다.
대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름 제어 및 추가적인 로직을 처리 한 뒤 접근 할 수 있습니다.
※ GoF 디자인 패턴에서는 접근 제어를 목적으로 구현한 경우 프록시 패턴,
※ 새로운 기능 추가(로깅, 데이터 검증 등)가 목적인 경우 데코레이터 패턴으로 분류합니다.
프록시 정의 및 특징
- 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)
- 지연 로딩(Lazy Initialization) 방식
- 무거운 객체의 생성 또는 로딩을 필요할 때만 생성한다.
- 실제 객체의 생성에 많은 리소스가 필요하지만, 호출빈도는 낮은 경우
- 언리얼의 Texture, Mesh 등의 리소스를 필요할 때만 로드한다.
- https://dev.epicgames.com/documentation/ko-kr/unreal-engine/proxy-geometry-tool-overview-in-unreal-engine
- 서비스가 시작 될 때 객체를 생성하지 않고 객체 초기화가 실제로 필요한 시점에 초기화 한다.
원격 프록시 (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에 대한 접근권한을 특정 플레이어에만 조작하도록 제한하는 경우
'디자인패턴' 카테고리의 다른 글
[디자인 패턴] 옵저버 패턴 (Observer Pattern) (0) | 2025.02.28 |
---|---|
[디자인패턴] - MVC, MVVM 패턴 (1) | 2025.02.18 |
Factory Method Pattern (0) | 2024.12.24 |
Command Pattern (2) | 2024.12.23 |
디자인 패턴의 정의 및 종류 (0) | 2024.12.05 |