클린아키텍처라고 들어보셨나요? 그렇다면 DI 도 들어보셨나요?
이번 포스트는 클린아키텍처에 대한 내용보다 DI을 중심으로 외부 라이브러리를 소개하려고 합니다. DI를 사용하는 목적이 다양하겠지만 객체의 생성 시 의존성을 줄이기 위해서 DI 를 활용을 한다고 생각합니다. 이번 포스트는 DI 라이브러리인 Koin과 Hilt 의 차이를 알아보며 DI에 좀더 가까워지겠습니다.
Koin 과 Hilt 사용법에 대한 포스트는 정식 사이트 소개로 대체하겠습니다.
DI을 왜 사용할까?
Android 공식 사이트에서는 DI을 사용하는 목적에 대해서 1) 클래스 재사용 가능 및 종속 항목 분리 2)리팩터링 편의성 3)테스트 편의성 으로 말합니다.
► 클래스 재사용 가능 및 종속 항목 분리: 종속 항목 구현을 쉽게 교체할 수 있습니다. 컨트롤 반전으로 인해 코드 재사용이 개선되었으며 클래스가 더 이상 종속 항목 생성 방법을 제어하지 않지만 대신 모든 구성에서 작동합니다.
►리팩터링 편의성: 종속 항목은 API 노출 영역의 검증 가능한 요소가 되므로 구현 세부정보로 숨겨지지 않고 객체 생성 타임 또는 컴파일 타임에 확인할 수 있습니다.
► 테스트 편의성: 클래스는 종속 항목을 관리하지 않으므로 테스트 시 다양한 구현을 전달하여 다양한 모든 사례를 테스트할 수 있습니다.
Koin 이란?
Koin은 Kotlin 개발 환경에 쉽게 적용할 수 있는 경량화된 DI 프레임워크입니다.
Koin의 특징을 다음과 같이 정의할 수 있습니다.
• Kotlin DSL을 사용
• 런타임에서 의존성 주입
• AAC ViewModel 사용 시 별도의 라이브러리를 통해 의존성 주입이 가능
Koin는 다른 DI 프레임워크보다 러닝커브가 낮아서 도입하기에는 어려움이 없습니다.
장점
• 러닝커브가 낮아 쉽고 빠르게 DI를 적용할 수 있습니다.
• Kotlin 개발 환경에 도입하기 쉽다.
• 별도의 어노테이션을 사용하지 않기 때문에 컴파일 시간이 단축된다.
• ViewModel 주입을 쉽게 할 수 있는 별도의 라이브러리를 제공한다.
단점
• 런타임에 서비스 로케이팅을 통해 인스턴스를 동적으로 주입해주기 때문에 런타임 퍼포먼스가 떨어진다.
• 리플렉션을 이용하기 때문에 성능상 좋지않다.
•koin.get()
함수와 같이 모듈간 의존성에 대해 신경을 쓰지 않고 인스턴스를 사용하는 경우, 추후 멀티모듈로 도입 시 어려움을 겪을 수 있다.
리플렉션
구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
자세한 koin 에 대한 설명은 Koin 정식 사이트 에서 확인 가능합니다.
Hilt 란?
Hilt는 Google이 개발한 Android용 DI 라이브러리로, Dagger를 기반으로 구축되었습니다. Dagger을 좀더 쉽게 접근할 수 있게 개발한 Hilt 는 Jetpack의 권장 라이브러리 입니다.
Hilt는 프로젝트의 모든 Android 클래스에 컨테이너를 제공하고 수명 주기를 자동으로 관리함으로써 애플리케이션에서 DI를 사용하는 표준 방법을 제공합니다.
장점
• Dagger의 기능을 단순화하고 보일러플레이트 코드를 줄이면서 통합성과 안정성을 제공
• Hilt는 컴파일 타임에 의존성 그래프를 생성하므로 앱 시작 시간이 빠름
• 안드로이드 컴포넌트를 통해 액티비티, 프래그먼트, 서비스 등의 Android 클래스에 주입 쉬움
단점
• 러닝커브가 있어 DI 적용에 시간이 필요할 수 있음.
Hilt Android Develop 사이트에서 Hilt 의 사용법을 가이드 하고 있습니다.
Koin vs Hilt
대표적인 DI 라이브러리인 Koin과 Hilt 중에서 어느 라이브러리를 사용해야할까요?
각 라이브러리의 장단점이 다르기에 어떤 라이브러리를 추천하기는 어렵습니다. 진행하려는 프로젝트의 규모와 서비스 방향에 따른 앱 구성에 따라서 귀사에 맞는 라이브러리를 선택하면 됩니다.
Hilt(Dependency Injection) | Koin(Service Locator) | |
종속성 | 일부 핵심 클래스에 종속성 주입 | 모든 클래스가 Service Locator에 종속 |
호출방법 | 처음 한번만 호출(명시적인 호출이 없음) | inject 를 직접 호출 (명시적인 호출) |
의존 관계 | 의존 관계 파악이 쉬움 | 외존 관계 파악이 어려움 |
마무리
DI가 무엇인지에 대해서 알아봤고 이어서 Koin과 Hilt에 대해서 개념적으로 어떤 것인가 간단히 알아봤습니다.
DI가 처음 접하는 분들에게는 진입장벽이 높게 느껴질 것인데요. 바로 Koin 과 Hilt을 접근하는 것보다는 Dagger에 대해 개념부터 차근차근 공부하시면 DI에 대한 감을 잡는데 도움이 될 것입니다.
앞써 설명 드렸듯이 Dagger 보다 좀 더 편하게 사용할 수 있도록 Koin과 Hilt 라이브러리를 제공하고 있는데요.
러닝커브가 적은 Koin을 사용하는 것과 러닝커브는 있지만 안드로이드 디벨로퍼에서 가이드하고 있는 Hilt 중 프로젝트 특성에 맞춰서 선택해서 사용하시면 됩니다.
자세한 Koin 과 Hilt 설명은 공식 사이트를 통해 공부하는 것을 추천드립니다.
DI 를 도입할지 고민을 하고 있다면 도입을 고려해보는 것도 좋을것으로 생각됩니다.