Table of Contents

04. Dependency Injection

이 문서의 목표

VContainer 기반 DI가 Framework에서 어떻게 쓰이는지 이해한다.

왜 필요한가

System을 new로 직접 생성하면 교체/테스트가 어렵고 초기화 순서를 보장할 수 없다. DI는 생성과 사용을 분리해 이 문제를 해결한다.

언제 사용하는가

새 System/Service를 추가할 때, Controller에서 System을 사용할 때 항상 [Inject]를 사용한다.

프로젝트에서 어떤 역할인가

  • 모든 DI 등록은 Scope 클래스 내부에서만 수행한다. Scope 외부 builder.Register 호출 금지.
  • 동적 생성은 Object.Instantiate 대신 _resolver.Instantiate를 사용해 생성된 객체도 DI 대상이 되게 한다.

실제 게임에서는 언제 호출되는가

RootBootstrap.Initialize() -> RootScope 인스턴스화 -> ContainerBuilder.Build() 시점에 전체 System이 등록된다. 이후 각 MonoBehaviour/Controller는 [Inject] 필드로 주입받는다.

코드 예제

public class EnemyController : MonoBehaviour
{
    [Inject] private IAssetSystem _asset;
    [Inject] private IStatSystem _stat;
}

관련 Sample

Samples/Core/CoreSample.cs

Best Practice

  • 외부 라이브러리는 직접 호출하지 않고 Integration 계층 System을 통해 호출한다.
  • 예외(UnityEngine.Time, SceneManager 등 Unity 자체 API)를 System 내부에서 직접 쓸 경우 반드시 주석으로 이유를 명시한다.

자주 하는 실수

  • Scope 외부에서 builder.Register 호출
  • Object.Instantiate로 생성해 DI 주입이 되지 않는 객체를 만듦

실습 과제

  1. 새 인터페이스 하나를 정의하고 RootScope.Configure() 끝에 등록해본다.
  2. 임의의 Controller에서 [Inject]로 주입받아 사용해본다.

이전 문서 / 다음 문서

이전: 03_Project_Structure.md 다음: 05_Common.md

관련 API

MCP_Index.md Core 섹션