### **DI (Dependency Injection)란 무엇인가?** 이 문서는 DI(Dependency Injection, 의존성 주입)의 개념과 그 중요성을 설명합니다. DI는 객체 지향 프로그래밍(OOP)에서 코드의 **결합도를 낮추는(decoupling)** 중요한 기술입니다. **DI의 정의 및 목적:** - DI는 코드에서 **불필요한 의존성(unconcerned dependencies)을 제거**하는 OOP의 일반적인 기법입니다. - 이를 통해 **테스트 용이성(testability), 유지보수성(maintainability), 확장성(extensibility), 교체 가능성(exchangeability)**을 객체 그래프(object graph)에 가져다줍니다. **OOP의 기본 설계 원칙:** - **약한 모듈 결합(weak module coupling)**과 **강한 모듈 응집(strong module cohesion)**. - OOP는 이를 객체를 통해 구현합니다. 1. **객체는 자신의 책임에 대한 세부 사항을 숨깁니다(캡슐화).** 2. **객체는 자신의 책임이 아닌 작업을 다른 객체에게 위임합니다.** **DI가 해결하는 문제:** - 위임할 객체를 클래스 코드 내부에 직접 작성하면 **소스 코드 수준에서 강한 결합(tight coupling)**이 발생합니다. - 클래스에서 불필요한 의존성을 배제하는 유일한 방법은 **외부에서 의존성을 전달(pass it in from outside)**받는 것입니다. - DI는 클래스가 외부에서 의존성을 주입받을 수 있도록 하며, **의존성을 완전히 외부에서 해결하는 장소(a place to resolve dependencies completely outside)**를 제공하는 기술입니다. **추가 자료 (Further reading):** - "Manning | Dependency Injection in .NET" - "Lightweight IoC Container for Unity - Seba's Lab" ### **용어 (Terminology)** DI와 관련된 주요 용어들을 정의합니다. - **DI Container (DI 컨테이너):** 필요한 모든 종속성 참조를 한 번에 해결하고 자동 와이어링(auto-wiring)을 실행하는 역할을 합니다. - **Composition Root (컴포지션 루트):** 의존성을 해결하기 위한 설정을 만드는 곳입니다. VContainer에서는 주로 `LifetimeScope`의 `Configure` 메서드가 이 역할을 합니다. - **Auto-wiring (자동 와이어링):** 최소한의 설정으로 컨테이너 내에서 서비스를 관리할 수 있게 해주는 기능입니다. DI 라이브러리가 일반적으로 이를 수행합니다. - **IoC (Inversion of Control, 제어의 역전):** 제어 흐름 책임이 있는 객체를 엔트리 포인트(진입점)로 만드는 것입니다. 전통적인 프로그래밍에서는 사용자 입력 처리 책임이 엔트리 포인트에 있었습니다. ### **Unity를 위한 DI가 필요한 이유 (Why DI for Unity ?)** 이 섹션은 Unity 환경에서 DI의 특별한 필요성과 이점을 설명합니다. - Unity에서 **MonoBehaviour는 C# 코드의 엔트리 포인트**인 동시에, **"뷰 컴포넌트(View component)"** 역할도 합니다. - 현대 애플리케이션 설계에서는 **"도메인 로직(domain logic)과 프리젠테이션 레이어(presentation layer, View component)의 분리"**가 중요합니다. - 그러나 MonoBehaviour는 뷰로서의 동작 외에도 이벤트 처리, 제어 흐름, 도메인 로직 호출 등 **많은 역할을 겸하는 경향**이 있습니다. 이는 모던 애플리케이션 설계 원칙에 위배됩니다. - DI의 목적 중 하나는 **IoC(제어의 역전)**입니다. DI 컨테이너를 사용하면 **순수 C# 클래스를 엔트리 포인트로 만들 수 있습니다(MonoBehaviour가 아닌).** - 이는 **제어 흐름과 다른 도메인 로직을 MonoBehaviour의 뷰 컴포넌트 기능으로부터 분리**할 수 있음을 의미합니다. - 뷰 컴포넌트는 런타임에 동적으로 생성/파괴되지만, 제어 흐름이나 도메인 로직과 같은 "기능"들은 더 안정적인 생명주기를 가집니다. - 일반적으로, **뷰 레이어를 상태 비저장(stateless)으로 만들고, 제어 흐름 및 데이터 관리와 분리**하는 것이 좋습니다. ### 요약 DI가 왜 필요한지, 어떤 이점을 제공하는지, 그리고 특히 Unity 개발에서 MonoBehaviour의 다중 역할을 분리하고 더 깔끔하고 유지보수하기 쉬운 아키텍처를 구축하는 데 DI가 어떻게 기여하는지를 명확히 설명합니다. --- 이전 : [[1.1 What is VContainer]] | 다음 : [[2.1 Installation]]