### **VContainer (VContainer란 무엇인가)**
이 문서는 VContainer가 Unity 게임 엔진을 위한 **매우 빠른 DI(Dependency Injection) 프레임워크**임을 강조합니다. 이름의 "V"는 Unity의 초기 "U"를 더 얇고 견고하게(thinner and solid) 만든다는 의미를 담고 있습니다.
**핵심 특징:**
- **빠른 Resolve (Fast Resolve):** Zenject보다 기본적으로 5-10배 더 빠른 Resolve 속도를 제공합니다. 이는 의존성을 해결하고 인스턴스를 가져오는 과정이 매우 효율적임을 의미합니다.
- **최소 GC 할당 (Minimum GC Allocation):** Resolve 과정에서 새로 생성되는 인스턴스 외에는 가비지 컬렉션(GC) 할당이 거의 없다는 점을 강조합니다. 이는 런타임 성능에 매우 중요한 이점입니다.
- **작은 코드 크기 (Small code size):** 내부적으로 사용되는 타입의 수가 적고, 가상 메서드 호출(callvirt)도 최소화되어 코드 베이스가 가볍습니다.
- **올바른 DI 방식 지원 (Assisting correct DI way):** 간단하고 투명한(transparent) API를 제공하며, 엄선된 기능들만을 포함하여 DI 선언이 지나치게 복잡해지는 것을 방지합니다. 이는 개발자가 DI를 올바르게 사용하도록 돕는다는 의미를 내포합니다.
- **불변 컨테이너 (Immutable Container):** 스레드 안전성(Thread safety)과 견고성(robustness)을 제공합니다.
**제공하는 기능 (Features):**
- **주입 방식:**
- **Constructor Injection (생성자 주입):** 객체 생성 시 생성자를 통해 의존성을 주입합니다.
- **Method Injection (메서드 주입):** 특정 메서드를 통해 의존성을 주입합니다. MonoBehaviour와 같이 생성자 주입이 어려운 경우에 유용합니다.
- **Property & Field Injection (속성 & 필드 주입):** 클래스의 속성이나 필드에 직접 의존성을 주입합니다.
- **Plain C# 엔트리 포인트 (Plain C# entry point):** Unity의 PlayerLoop System에 자체적으로 통합되어 순수한 C# 클래스를 애플리케이션의 진입점으로 사용할 수 있게 합니다. 이는 MonoBehaviour에 의존하지 않고 제어 흐름과 도메인 로직을 구성할 수 있음을 의미합니다.
- **유연한 스코핑 (Flexible scoping):** 의존성 인스턴스의 생명주기를 유연하게 관리할 수 있는 스코핑 기능을 제공합니다.
- **중첩된 Lifetime Scope 생성 (Nested Lifetime Scope):** 애플리케이션이 필요에 따라 비동기적으로 중첩된 `Lifetime Scope`를 자유롭게 생성할 수 있습니다.
- **Roslyn Source Generator를 통한 가속 모드 (Accelerated mode with Roslyn Source Generator):** 컴파일 시점에 코드를 생성하여 런타임 성능을 향상시키는 기능을 제공합니다.
- **Diagnostics Window (진단 창):** Unity 에디터 내에서 컨테이너의 상태, 등록된 의존성 등을 시각적으로 확인하고 디버깅할 수 있는 도구를 제공합니다.
- **UniTask 통합 (UniTask Integration):** Unity에서 비동기 프로그래밍을 위한 UniTask 라이브러리와의 통합을 지원합니다.
- **ECS 통합 (ECS Integration beta):** Unity의 ECS(Entity Component System)와의 통합을 베타 버전으로 지원합니다.
**DI + Inversion of Control for Unity (Unity를 위한 DI + 제어 반전):**
이 섹션은 VContainer를 사용하는 핵심 목적과 철학을 설명합니다.
- DI 컨테이너를 사용하면 **MonoBehaviour가 아닌 순수 C# 클래스를 엔트리 포인트(진입점)로 만들 수 있습니다.**
- 이는 **제어 흐름(Control Flow)과 다른 도메인 로직(Domain Logic)을 MonoBehaviour의 View Component 기능으로부터 분리**할 수 있음을 의미합니다.
- 일반적인 Unity 프로젝트에서 MonoBehaviour는 View 컴포넌트 역할 외에 이벤트 처리, 제어 흐름, 도메인 로직 호출 등 많은 역할을 겸하는 경향이 있습니다. VContainer는 이러한 역할들을 분리하여 보다 클린하고 테스트하기 쉬운 아키텍처를 구축하는 데 도움을 줍니다.
**추가 자료 (Further reading):**
- "Manning | Dependency Injection in .NET"
- "Lightweight IoC Container for Unity - Seba's Lab"
**성능 (Performance):**
문서에는 Zenject와의 성능 벤치마크 그래프가 포함되어 있으며, VContainer의 Resolve 속도가 Zenject보다 훨씬 빠르다는 것을 시각적으로 보여줍니다.
### 요약
VContainer가 Unity 개발에서 강력한 DI 솔루션으로서, 빠른 성능, 효율적인 자원 관리, 그리고 개발자가 클린 아키텍처를 구축하고 유지보수성을 향상시키는 데 기여하는 핵심 기능을 제공한다는 점을 강조합니다. 특히 MonoBehaviour의 역할 분리를 통한 제어 반전의 이점을 명확히 설명합니다.
---
다음 : [[1.2 What is DI]]