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 주입이 되지 않는 객체를 만듦
실습 과제
- 새 인터페이스 하나를 정의하고
RootScope.Configure()끝에 등록해본다. - 임의의 Controller에서
[Inject]로 주입받아 사용해본다.
이전 문서 / 다음 문서
이전: 03_Project_Structure.md 다음: 05_Common.md
관련 API
MCP_Index.md Core 섹션