[Android] DI Framework 선택지(Dagger2, Koin, Hilt)

Gunt·2021년 3월 5일
11
post-custom-banner

잘못된 정보나 수정할 사항 or 피드백은 언제든 환영합니다.


안드로이드의 Dependency Injection과 관련하여 핫한 framework는

Dagger2
Koin
Hilt

를 들 수 있다.

그럼 이 세 가지의 차이가 무엇이고 어떤 것을 쓰는 것이 좋을까?

각각의 특징과 장단점을 파악해보고 본인의 사용하려는 프로젝트에 대입해서 읽어보는 것이 좋을 것 같다. 의존성 주입 개념은 다른 글에서도 쉽게 찾을 수 있으니 의존성 주입 개념에 대해서는 설명하지 않는다.

1. Dagger2

가장 많이 보이는 DI Framework라 생각된다.

사용하려는 프로젝트에 Java와 Kotlin이 함께 작성되어있는 프로젝트에서 DI를 적용하려면 Koin이라는 선택지가 제외된다. (2.Koin에서 추가 설명할거임)

Dagger2 적용을 위해 환경을 세팅해야하는 과정과 원활한 적용에 필요한 러닝커브가 크다.
러닝커브에 사용되는 비용이 상대적으로 저렴한 (이미 알거나 금방 배울 수 있는 수준의 개발 역량을 가진)사람들이 쓰기에 알맞은 Framework이지 않을까 한다.

컴파일 시 애노테이션을 읽고 scope에 맞는 DI container와 주입할 class파일을 generate하여 의존성을 주입한다. 당연히 compile에 필요한 시간이 늘어나게 되고, 문제가 있을 경우 Compile 시점에서 에러를 발생시킨다. 때문에 빌드가 완료된 파일은 어느 정도의 의존성 주입에 대해서는 안정성이 보장된다고 생각한다.

2. Koin

Koin은 Kotlin DSL(Domain Specific Language, 도메인 특화 언어)로 만들어졌다.

Koin의 특징이자 장점이자 단점은 Kotlin DSL?

Kotlin 개발 환경에 쉽게 적용할 수 있는 경량화된 DI 프레임워크. Kotlin 개발 환경에서 도입하기에 가장 가볍고 빠르게 적용할 방법이라 생각한다.
Dagger2에 비해 사용법이 쉽고, DSL을 활용하여 runtime에 의존성을 주입한다.
이는 runtime error가 발생할 수 있고 compile시점에서 오류 확인이 어려울 수 있다.

대신 test를 잘 작성하여 애플리케이션의 퀄리티를 보장하는 것이 개선할 수 있는 방법이 될 수 있다.

그러나 Framework에서 compile error를 확인하는 것과 unit Test를 통해 error를 확인하는 것. 어느 것이 배포 전 오류를 잘 잡아낼 수 있을까? 라고 한다면 Dagger2 >= Koin이 되지 않을까 한다. 아무래도 unit Test 또한 사람이 하는 것이기 때문에 어쩔 수 없을 것이다.

Dagger2와 Koin의 에러시점이 다른 이유

Dagger2 동작 방식

Build -> (DI container, DI 객체 생성 및 주입 관련 class) generate -> run

Koin의 동작 방식

Build -> run(DI container, DI 객체 생성 및 주입)

'동작 방식의 차이' 때문에 에러 시점이 다르다.

3. Hilt

Dagger를 기반으로 만들어진 DI Framework로 Dagger2와 비슷한 동작방식을 가지고 있다.

Hilt를 적용할 때 가장 걱정하는 부분은 안정성 보장과 현재 개발 환경과의 충돌이 될 수 있다.

Beta버전이 나온 것도 최근이고(얼마전까지는 2.32-alpha버전이었다.) 공식 문서에도 Android Studio 4.0 버전 이상부터 사용가능하다고 나와있다.
보수적이고 안정적인 서비스를 유지하는 프로젝트에는 사용이 어렵지만, 개인 프로젝트 단계에서는 써볼만하다.

현재(작성일 기준) 2.33-Beta버전까지 출시됐고, 계속해서 업그레이드된 버전들이 나올 것이라 예상된다. 구글 문서도 빠르게 업데이트 중이고, 낮은 러닝커브와 Dagger의 장점을 모아 구글에서 만들어지고 있는 Framework인만큼 앞으로도 계속해서 발전하고 자주 사용될 것이라 예상한다.

결론

Dagger2KoinHilt
러닝커브높음낮음낮음
JavaOXO
KotlinOOO
에러 검출 시점Compile TimeRuntimeCompile Time
실제 프로젝트 검증많은 앱에서 검증됨많은 앱에서 검증됨beta버전(조금씩 보임)

개발자는 완벽한 프로그램을 만들어내는 것이 목적이 아니다.

비즈니스를 위한 제품을 개발하는 사람이라 생각한다.

좋은 퀄리티의 Product를 지향하지만 가장 우선 시 되어야 할 부분은 비즈니스에 맞는 기술을 선택하는 것이다. 어떤 기술을 선택함에 있어서 현 상황과 비용을 고려하여 합리적인 선택을 하는 것도 개발자의 역량이라 생각한다.

profile
기술에 생각 더하기
post-custom-banner

2개의 댓글

comment-user-thumbnail
2021년 3월 22일

마지막 문장이 너무 와 닿네요 ^^

답글 달기
comment-user-thumbnail
2021년 5월 3일

좋은 글 잘 보고 갑니다.
세 가지 중 어떤 걸 적용할 지 고민하고 있었는데, 결정에 도움이 되었습니다.
감사합니다.

답글 달기