### **VContainer + UniRx** - **UniRx란?** - Unity에 최적화된 Rx(Reactive Extensions) 라이브러리입니다. - 이벤트, 비동기 작업, 데이터 스트림 등을 관찰 가능한(Observable) 시퀀스로 추상화하여, 선언적이고 조합 가능한 방식으로 처리할 수 있게 합니다. - **VContainer 진입점과 UniRx의 결합:** - 문서는 `IDisposable` 인터페이스를 구현하는 VContainer의 진입점(Entry Point)과 UniRx의 `CompositeDisposable`을 함께 사용하는 예시를 보여줍니다. - `CompositeDisposable`은 여러 `IDisposable` 객체를 한 번에 관리하고 폐기(Dispose)할 수 있게 해주는 UniRx의 유틸리티 클래스입니다. **기본 예시:** C# ``` public class FooController : IStartable, IDisposable { // CompositeDisposable을 사용하여 여러 IDisposable 객체를 관리 readonly CompositeDisposable disposable = new CompositeDisposable(); void IStartable.Start() { // fooObservable은 어떤 Observable<T> 타입이라고 가정 fooObservable .Subscribe(_ => /* Do something */) // Observable 구독 .AddTo(disposable); // 구독된 IDisposable을 CompositeDisposable에 추가 } void IDisposable.Dispose() { // LifetimeScope가 폐기될 때 CompositeDisposable 내부의 모든 IDisposable을 폐기 disposable.Dispose(); } } ``` - **설명:** - `FooController`는 `IStartable` (VContainer 진입점)과 `IDisposable`을 모두 구현합니다. - `IStartable.Start()` 메서드에서 `fooObservable`을 구독하고, 이 구독으로 반환되는 `IDisposable` 객체를 `CompositeDisposable`에 추가합니다. - `IDisposable.Dispose()` 메서드에서는 `disposable.Dispose()`를 호출하여 `CompositeDisposable`에 추가된 모든 구독 및 리소스를 한 번에 해제합니다. - 이러한 패턴은 `FooController` (또는 이를 포함하는 `LifetimeScope`)의 생명주기와 UniRx 구독의 생명주기를 연동하여, 객체가 더 이상 필요 없을 때 메모리 누수를 방지하는 데 매우 효과적입니다. **확장 메서드를 통한 간결한 구문 (AddTo(this)):** - 문서는 `AddTo(this)`와 같은 단축 구문을 사용할 수 있도록 `ControllerBase`라는 기본 클래스와 `DisposableExtensions`라는 확장 메서드를 제안합니다. <!-- end list --> C# ``` // 컨트롤러 베이스 클래스 public class ControllerBase : IDisposable { readonly CompositeDisposable disposable = new CompositeDisposable(); void IDisposable.Dispose() => disposable.Dispose(); // IDisposable 아이템을 CompositeDisposable에 추가하는 헬퍼 메서드 public void AddDisposable(IDisposable item) { disposable.Add(item); } } // 확장 메서드 public static class DisposableExtensions { public static T AddTo<T>(this T disposable, ControllerBase controller) where T : IDisposable { controller.AddDisposable(disposable); return disposable; } } ``` - **사용 예시:** C# ``` public class FooController : ControllerBase, IStartable // ControllerBase 상속 { void IStartable.Start() { someObservable .Subscribe(...) .AddTo(this); // 간결하게 현재 컨트롤러의 CompositeDisposable에 추가 } } ``` - **설명:** `ControllerBase`를 상속하고 `AddTo` 확장 메서드를 사용하면, `UniRx`의 `IDisposable` 객체를 `this` (현재 컨트롤러 인스턴스)에 간편하게 추가하여 관리할 수 있습니다. 이는 코드를 더 깔끔하고 읽기 쉽게 만듭니다. ### 요약 VContainer의 진입점과 UniRx를 함께 사용하여 반응형 프로그래밍 패턴을 구현하는 방법을 제시합니다. `IStartable` 및 `IDisposable` 인터페이스를 통해 VContainer의 생명주기에 UniRx 구독을 통합하고, `CompositeDisposable`을 활용하여 효율적인 리소스 관리를 수행하는 방법을 설명합니다. 또한, `AddTo(this)`와 같은 확장 메서드를 통해 코드의 가독성과 유지보수성을 높이는 팁을 제공합니다. --- 이전 : [[5.2 UniTask]] | 다음 : [[5.4 MessagePipe]]