### **라이프타임 종류** VContainer는 크게 세 가지 종류의 라이프타임을 제공합니다: 1. **Singleton (싱글턴)** - **설명:** 컨테이너 내에서 **단일 인스턴스**만을 생성하고 유지합니다. 즉, 해당 컨테이너가 존재하는 동안 이 타입으로 등록된 객체를 요청하면 항상 동일한 인스턴스를 반환합니다. - **특징:** - 모든 컨테이너(부모, 자식 스코프 포함)에서 이 `Singleton`으로 등록된 객체를 요청하면 가장 가까운(등록된) 스코프에서 관리하는 동일한 인스턴스를 받게 됩니다. - 동일한 타입이 같은 컨테이너에 여러 번 `Singleton`으로 등록될 수 없습니다. - `LifetimeScope`가 파괴될 때, 해당 스코프에 등록된 `Singleton` 인스턴스 중 `IDisposable`을 구현한 객체는 `Dispose()` 메서드가 호출됩니다. - **사용처:** 애플리케이션 전반에 걸쳐 공유되어야 하는 서비스(예: 설정 관리자, 데이터베이스 클라이언트, 게임 상태 관리자 등)에 적합합니다. 2. **Transient (트랜지언트)** - **설명:** 객체를 요청할 때마다 **새로운 인스턴스**를 생성합니다. - **특징:** - `Resolve` 호출 시마다 새로운 인스턴스가 생성됩니다. - 부모-자식 관계의 `LifetimeScope`에서 동일한 타입이 `Transient`로 등록되어 있으면, 자식 스코프는 자신만의 새로운 인스턴스를 생성합니다. - `IDisposable`을 구현해도 `Dispose()`가 자동으로 호출되지 않습니다. (이는 각 인스턴스가 독립적으로 관리되어야 함을 의미합니다.) - **사용처:** 매번 다른 상태를 가져야 하거나, 일회성으로 사용되는 객체(예: 특정 작업의 결과를 담는 DTO, 임시 로깅 객체 등)에 적합합니다. 3. **Scoped (스코프드)** - **설명:** **각 `LifetimeScope` 내에서 단일 인스턴스**를 유지합니다. 즉, 동일한 `LifetimeScope` 내에서 요청하면 항상 동일한 인스턴스를 반환하지만, 다른 `LifetimeScope`에서는 새로운 인스턴스를 생성합니다. - **특징:** - `LifetimeScope`가 하나만 있는 경우에는 `Singleton`과 유사하게 동작합니다. - 자식 `LifetimeScope`를 생성하면, 자식 스코프 내에서 `Scoped`로 등록된 객체는 부모와 다른 새로운 인스턴스를 갖게 됩니다. - 동일한 자식 스코프 내에서는 항상 동일한 인스턴스를 반환합니다. - `LifetimeScope`가 파괴될 때, 해당 스코프에 `Scoped`로 등록된 `IDisposable`을 구현한 객체는 `Dispose()` 메서드가 호출됩니다. - **사용처:** 씬(Scene), 레벨, 특정 UI 모듈 등과 같이 명확한 수명 주기를 가지고 그 범위 내에서만 공유되어야 하는 객체에 적합합니다. ### **부모/자식 관계의 라이프타임** VContainer의 `LifetimeScope`는 계층적인 부모-자식 관계를 가질 수 있으며, 이 관계는 객체 주입에 다음과 같은 영향을 미칩니다. - **의존성 탐색:** 등록된 객체를 찾지 못하면, 현재 `LifetimeScope`는 부모 `LifetimeScope`로 이동하여 의존성을 찾으려고 시도합니다. - **`Lifetime.Singleton` 동작:** - 기본적으로 항상 동일한 인스턴스를 반환합니다. - 만약 부모와 자식 스코프에 동일한 타입이 `Singleton`으로 등록되어 있다면, 요청한 스코프에서 가장 가까운(현재 스코프 또는 가장 가까운 부모 스코프) 인스턴스를 반환합니다. - `LifetimeScope`가 파괴될 때, `IDisposable`을 구현한 객체는 `Dispose()`가 호출됩니다. - **`Lifetime.Transient` 동작:** - `Resolve` 호출 시마다 새로운 인스턴스가 생성됩니다. - 부모와 자식 스코프에 동일한 타입이 `Transient`로 등록되어 있다면, 각 스코프는 자신만의 새로운 인스턴스를 생성합니다. - **`Lifetime.Scoped` 동작:** - 각 `LifetimeScope`마다 다른 인스턴스를 갖습니다. - 동일한 `LifetimeScope` 내에서는 같은 인스턴스를 반환합니다. - 부모와 자식 스코프에 동일한 타입이 `Scoped`로 등록되어 있다면, 각 스코프는 자신만의 새로운 인스턴스를 생성합니다. - `LifetimeScope`가 파괴될 때, `IDisposable`을 구현한 객체는 `Dispose()`가 호출됩니다. **주의사항 (CAUTION):** - 씬이 여전히 활성화되어 있고 `LifetimeScope`만 파괴되는 경우, `Lifetime.Scoped`로 등록된 `MonoBehaviour`는 자동으로 파괴되지 않습니다. `LifetimeScope`와 함께 파괴되도록 하려면 해당 `MonoBehaviour`를 `LifetimeScope`의 자식 트랜스폼으로 만들거나, `IDisposable`을 구현하여 수동으로 `Dispose()` 로직을 처리해야 합니다. ### 요약 VContainer의 `Lifetime` 개념을 소개하며, `Singleton`, `Transient`, `Scoped` 세 가지 주요 라이프타임이 객체 인스턴스화 및 관리에 어떻게 영향을 미치는지 설명합니다. 또한, `LifetimeScope`의 부모-자식 관계가 이 라이프타임 규칙에 어떻게 적용되는지를 명확히 하여, 개발자가 Unity 애플리케이션에서 의존성 주입을 통해 리소스와 객체의 생명주기를 효과적으로 제어할 수 있도록 돕습니다. --- 이전 : [[5.5 ECS (beta)]] | 다음 : [[6.2 Generate child scope via scene or prefab]]