Skip to content

Latest commit

 

History

History
40 lines (21 loc) · 3.89 KB

File metadata and controls

40 lines (21 loc) · 3.89 KB

Unity DI Framework

유니티 DI 프레임워크에 관련하여 정리합니다.

유니티에서 객체지향을 제대로 사용하기에는 어려운 부분이 분명 존재한다. 내가 느끼는 가장 큰 문제는 유니티 엔진 자체가 컴포넌트 패턴 기반이라 Mono Behaviour GameObject가 각각의 라이프 사이클을 가지고 있기 때문에, 객체지향 프로그래밍 구조를 적용하기 어렵다고 생각한다.

물론 한 게임오브젝트를 기준으로 트리형태로 내려가며 이 구조를 유지할 수 있지만, 이 경우 반대로 객체지향 프로그래밍의 장점인 재사용성, 확장성, 유지보수성을 해칠 수 있으며, Unity엔진의 힘을 제대로 활용하지 못하게 된다.

검색해보니 MonoBehaviour만 Gameobject를 가질 수 있다는 점도 영향을 주는 것 같다.

나는 이런 문제와 객체지향을 공부할 당시에 배운 내용대로 실제 프로젝트의 구조는 대부분 의존성 주입형태를 유지하여 게임 구조를 잡았다. 예를 들어 하나의 컨텐츠를 설계한다고 했을 때, 가장 상위에는 Controller가 존재하고, 이 객체는 하위 오브젝트의 의존성을 관리한다. (책임과 역할에 맞게 연결 역할만 수행한다.) 이후 하위로 트리로 뻗어나가 듯이 객체가 구성되고 하위가 상위를 참조할 수 없는 구조를 유지하고 주입만을 통해 상위 객체를 참조할 수 있도록 한다.

이 구조에서 좀 더 유연하고 테스트 가능하게 만들 땐, Mono를 상속받은 C# 클래스가 아닌 pllain C# 클래스를 사용하고, DI 프레임워크를 통해 의존성을 주입하여 객체를 관리했다. 인터페이스도 넣어서 이를 통해 객체 간의 의존성을 명확하게 정의하고, 테스트 용이성을 높였다.

이런 구조를 많이 사용하고 매번 드래그 앤 드롭하여 만들었지만, 이후 DI 프레임워크를 접하게 되었다. (나는 다 이렇게 만드는 줄 알았다.)

DI 프레임워크는 의존성 주입을 통해 객체의 생명주기를 관리하고, 객체 간의 의존성을 명확하게 정의할 수 있도록 도와준다. 이를 통해 코드의 재사용성과 테스트 용이성을 높일 수 있다.

쉽게 설명한다면 의존성 주입을 자동으로 관리해주고, 객체간의 의존성을 더 명확하게 정의하고 사전에 에러를 잡아준다. 프로젝트의 규모가 커질수록 더욱 유용하게 사용할 수 있다.

DI 프레임워크는 다양하게 존재하지만 대표적인 3개 정도만 소개하고자 한다. (이외에도 다양한 DI 프레임워크가 존재한다.)

가장 유명하고 대부분이 사용중일 것 같다. 처음 봤을 땐 복잡해서 내가 말한 방식이 더 유용하다고 생각했지만, 실제로 사용해보니 많은 장점이 있었다.

공식 문서의 형식 foo, bar로 친절히 설명이 되어있다. 런타임에 Reflection을 통해 의존성을 주입하고, 객체의 생명주기를 관리한다.

Extenject는 Zenject의 포크로, Zenject의 기능을 확장하고 개선한 버전이다. Extenject는 Zenject와 호환되며, 추가적인 기능과 개선된 성능을 제공한다.

오픈소스의 장점을 제대로 활용한 예시..

가장 사용해보고 싶은 DI 프레임워크이다. 실제 이 레포를 보고 이 글을 작성해야겠다고 생각했다. (물론 1년이 지나서 작성하지만..) 레포의 설명처럼 가장 빠르고 가벼운 DI 프레임워크라고 생각한다.