티스토리 뷰

반응형

클린아키텍처라고 들어보셨나요? 그렇다면 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 를 도입할지 고민을 하고 있다면 도입을 고려해보는 것도 좋을것으로 생각됩니다.

 

 

참고

Hilt Android Develop

Koin 정식 사이트 

반응형
댓글