디자인 패턴 : 프록시 패턴 (Proxy Pattern)
Proxy Pattern
- Proxy, '대리', '대리인'이라는 뜻으로 일을 대신 시키는 것을 의미
- OOP에서는 클라이언트가 객체를 직접 사용하는 것이 아닌 중간 프록시(대리인)을 거쳐 사용하는 패턴
- 대상 클래스,객체가 민감한 정보를 가지고 있거나, 무겁거나, 추가 기능을 가미하고 싶은 상황에서
원본 객체를 수정할수 없는 상황을 극복하기 위한 패턴
클라이언트는 프록시와 실제 객체의 차이를 모르고 사용한다 (같은 인터페이스를 구현)
즉, 실제 객체와 프록시를 '동일하게 취급'
이 방식으로 목표 subject의 함수를 직접 실행하는 것이 아니기 때문에 도중에 '과정'을 추가할 수 있다.
- 가상 프록시 : 지연 초기화 방식, 서비스가 시작될 때 객체를 생성하는 대신, 실제로 필요한 시점에 생성할 수 있게 함
Lazy Loading : 가상 프록시의 일종으로 필요한 데이터만 조회해서 성능 낭비를 방지하게 함. - 보호 프록시 : 특정 클라이언트만 객체에 접근할 수 있게 할 때, 프록시 객체를 통해 접근 권한을 검사함
- 로깅 프록시 : 로깅을 추가함
이런 방식을 통해 접근을 제어하거나, 기능을 추가하는데 기존의 객체를 수정하지 않고 처리할 수 있다.
다음은 가상 프록시를 통한 비동기 로딩의 과정이다.
public interface IAssetLoader
{
void LoadAsset();
}
using UnityEngine;
public class RealAssetLoader : IAssetLoader
{
private string assetPath;
public RealAssetLoader(string path)
{
assetPath = path;
}
public async void LoadAsset()
{
Debug.Log("Loading asset asynchronously...");
// Resources.LoadAsync()를 사용한 비동기 로딩
var resourceRequest = Resources.LoadAsync<GameObject>(assetPath);
// 로딩이 완료될 때까지 대기
while (!resourceRequest.isDone)
{
Debug.Log($"Loading progress: {resourceRequest.progress * 100}%");
await System.Threading.Tasks.Task.Yield(); // 유니티에서 비동기 대기를 처리
}
// 로드 완료
GameObject loadedAsset = resourceRequest.asset as GameObject;
Debug.Log("Asset loaded successfully.");
// 씬에 로드된 오브젝트 생성
if (loadedAsset != null)
{
GameObject.Instantiate(loadedAsset);
}
}
}
using UnityEngine;
public class ProxyAssetLoader : IAssetLoader
{
private RealAssetLoader realLoader;
private string assetPath;
public ProxyAssetLoader(string path)
{
assetPath = path;
}
public void LoadAsset()
{
if (realLoader == null)
{
Debug.Log("Initializing real loader...");
realLoader = new RealAssetLoader(assetPath);
}
// 로딩 과정을 추가 (여기선 단순 메시지 출력)
Debug.Log("Proxy: Preparing to load asset...");
realLoader.LoadAsset();
}
}
using UnityEngine;
public class AssetLoaderClient : MonoBehaviour
{
void Start()
{
// 프록시를 통해 자원 로드
IAssetLoader loader = new ProxyAssetLoader("Path/To/Your/Asset");
loader.LoadAsset();
}
}
이런 시긍로 async 방식을 통해 비동기적으로 로딩을 하는 도중에 로깅을 한다거나 UI를 업데이트 한다거나 등의 방식을 사용할 수 있다.
비동기와 동기를 왜 사용하는지, 원리가 무엇인지에 대한 정리가 아직 완벽하지 않아 추가로 할 예정이다.
요약
목적 : 목표 객체(구체적인 객체)를 변경시키지 않고 기능이나 권한의 추가
구현: 목표 객체(구체적인 객체)와 인터페이스를 공유하는 Proxy 객체 생성, Proxy 객체에 구체적인 객체 등록 후
인터페이스에서 강제로 구현하게 한 함수에 프록시 객체의 함수 추가
더 알아야할 키워드 : 동기와 비동기 / 유니티 메모리 관리
참조 : https://refactoring.guru/ko/design-patterns/visitor
비지터 패턴
/ 디자인 패턴들 / 행동 패턴 비지터 패턴 다음 이름으로도 불립니다: Visitor 의도 비지터(방문자) 패턴은 알고리즘들을 그들이 작동하는 객체들로부터 분리할 수 있도록 하는 행동 디자인 패턴
refactoring.guru
https://refactoring.guru/ko/design-patterns/proxy
프록시 패턴
/ 디자인 패턴들 / 구조 패턴 프록시 패턴 다음 이름으로도 불립니다: Proxy 의도 프록시는 다른 객체에 대한 대체 또는 자리표시자를 제공할 수 있는 구조 디자인 패턴입니다. 프록시는 원래 객체
refactoring.guru