### **MonoBehaviour에 주입 (Injecting into MonoBehaviours)** - **생성자 주입 불가:** `MonoBehaviour`는 생성자를 지원하지 않습니다. 따라서 `MonoBehaviour`에 의존성을 주입하려면 **메서드 주입**을 사용해야 합니다. - `[Inject]` 속성을 `MonoBehaviour`의 메서드에 추가하여 해당 메서드를 통해 의존성을 주입받도록 합니다. - **수동 주입 필수:** `MonoBehaviour` 메서드에 `[Inject]` 속성이 있다고 해서 자동으로 호출되는 것은 아닙니다. 다음 세 가지 방법 중 하나를 사용하여 의존성을 수동으로 주입해야 합니다. **MonoBehaviour 의존성 주입 방법:** 1. **`LifetimeScope` 인스펙터를 통한 주입:** - 특정 `MonoBehaviour`에 주입하고 싶을 때, `LifetimeScope` 컴포넌트의 인스펙터에서 `Auto Inject Game Objects` 목록에 해당 `GameObject`를 지정할 수 있습니다. - `LifetimeScope`가 초기화될 때, 지정된 `GameObject` 및 그 자식들의 모든 `MonoBehaviour`가 자동으로 주입됩니다. - **예시:** C# ``` // Sample Lifetime Scope (Script) // ... // Auto Inject Game Objects // Element 0 None (Game Object) // 여기에 MonoBehaviour가 붙어있는 GameObject를 할당 ``` 2. **`RegisterComponent*` 메서드를 통한 등록:** - `RegisterComponent`와 같은 메서드를 사용하여 `MonoBehaviour` 인스턴스를 컨테이너에 직접 등록할 수 있습니다. - 이 경우, 등록된 `MonoBehaviour`는 다른 클래스에 주입될 수도 있고, 자신에게 의존성이 주입될 수도 있습니다. - **예시:** C# ``` builder.RegisterComponent(yourBehaviour); ``` - 자세한 내용은 "Register MonoBehaviour" 섹션을 참조하라고 언급되어 있습니다. (이는 4.4 Register MonoBehaviour.pdf 문서에 해당합니다.) 3. **`IObjectResolver.Instantiate` 사용 (동적 생성 시):** - 런타임에 동적으로 생성되는 `MonoBehaviour` (예: 프리팹에서 생성되는 경우)에 주입하려면, `UnityEngine.Object.Instantiate` 대신 `IObjectResolver.Instantiate`를 사용해야 합니다. - `IObjectResolver.Instantiate`는 프리팹에서 `GameObject`를 인스턴스화하고, 그 `GameObject` 및 그 자식들의 `MonoBehaviour`에 의존성을 주입합니다. - **예시:** C# ``` var object1 = container.Instantiate(prefab); ``` - 더 자세한 내용은 "Register Callbacks" 또는 "Register Factory" 섹션을 참조하라고 안내합니다. (이는 4.3 Factories.pdf 및 4.7 Register Callbacks.pdf 문서에 해당합니다.) ### **VContainer가 모든 MonoBehaviour에 자동 주입하지 않는 이유:** 문서는 VContainer가 모든 `MonoBehaviour`에 자동으로 주입하지 않는 이유에 대해 몇 가지 중요한 설명을 제공합니다. - **Unity의 제약:** Unity는 모든 `GameObject` 또는 `MonoBehaviour`의 생성 시점을 감지할 좋은 방법을 제공하지 않습니다. 이로 인해 어떤 경우에는 자동 주입이 되고 어떤 경우에는 안 되는 혼란을 피하기 위해 명시적인 주입 방식을 채택했습니다. - **MonoBehaviour의 복잡성:** - `MonoBehaviour`는 C# 클래스이면서 런타임에 동적으로 생성/파괴될 수 있습니다. - 이러한 동적인 수명 주기를 가진 객체에 직접 주입하는 것은 참조 관리를 복잡하게 만듭니다. 가장 간단한 해결책은 그렇게 하지 않는 것입니다. - VContainer와 DI의 목적은 `MonoBehaviour`의 **제어 역전(Inversion of Control)**을 달성하는 것입니다. `MonoBehaviour`는 주로 "뷰 컴포넌트"로서 이벤트 감지 및 처리를 담당하고, 제어 흐름과 도메인 로직은 순수 C# 클래스로 분리하는 것이 좋습니다. - **프리팹 이식성:** `MonoBehaviour`가 명시적인 `Inject` 호출을 필요로 하면 Unity 프리팹의 이식성이라는 이점을 잃을 위험이 있습니다. - **데이터 주입 문제:** 화면에 표시할 데이터/상태를 `MonoBehaviour`가 알아야 하지만, 런타임에 빠르게 변하는 데이터는 `[Inject]`를 통한 주입 대상이 아니며, 인자(arguments)를 통해 단순한 "값"으로 처리하는 것이 더 낫습니다. ### 요약 `MonoBehaviour`의 특성 때문에 생성자 주입이 불가능하며, 대신 메서드 주입을 사용해야 한다고 설명합니다. 또한 `MonoBehaviour`에 의존성을 주입하는 세 가지 주요 방법을 제시하고, VContainer가 모든 `MonoBehaviour`에 자동 주입하지 않는 이유에 대해 Unity의 기술적 제약, `MonoBehaviour`의 역할 분리, 그리고 유지보수성 측면에서 자세히 설명합니다. 이는 VContainer가 `MonoBehaviour`를 "뷰 컴포넌트"로 간주하고, 핵심 로직은 순수 C# 클래스에서 관리하도록 권장하는 철학을 반영합니다. --- 이전 : [[3.3 Property Field Injection]] | 다음 : [[3.5 Container API]]