티스토리 뷰

Dependency Inject는 앱 개발에 있어 복잡한 생성코드를 제거하고, 객체의 라이프사이클을 효과적으로 관리할 수 있다는 장점이 있다.

또한 DI를 통해 종속 관계를 잘 정리하였다면, 테스트 코드도 객체를 주입하거나 Mock 객체를 생성하여 빠르고 쉽게 작성할 수 있다

 

안드로이드에서 가장 많이 쓰이는 DI 라이브러리는 Dagger다

구글에서 직접 관리하며 안드로이드 개발자 페이지에서도 Dagger에 대한 개발 가이드를 제공하고있으니 믿고 사용하면 된다.

 

하지만 Dagger를 사용하는 것은 상당히 어려운 일이다.

Dagger를 사용한 초반에는 이 것이 어떻게 동작을 하는지 이해하는 것부터 어렵다.

이해를 포기하고 일단 써보자는 식으로 접근하여도, Module,Component 등 생성해야하는 것들과 수만은 Annotation들은 Dagger를 처음 접한 사람들에게 절망감을 선사해 줄 것이다.

사실 나도 어찌저찌 Dagger를 사용하고있지만 필요할 때 마다 기존 것을 참고하거나 구글링을 해서 문제를 해결하고있어
당장 제로베이스에서 Dagger를 새로 설정하라고하면 다시 구글 가이드를 참고해야한다.

그정도로 Dagger의 사용법은 상당히 복잡하고 어렵다.

 

이러한 개발자들의 마음을 이해한 구글이 새로운 DI 라이브러리를 공개했다.

바로 Hilt.

Hilt는 Dagger를 기반으로 개발된 라이브러리로, Dagger보다 쉽게 설정할 수 있고, 안드로이드 클래스(Activity, Fragment 등) 최적화되어있어 보다 쉽게 사용할 수 있게되었다.

기본적인 객체 생성 및 주입 방법은 동일한데, 상용구를 최소화하고 미리 정의된 @annotation들이 많이 있어 복잡한 추가 없이 쉽게 사용할 수 있는 것이 Hilt의 장점이다.

 

장점은 크게 개로 볼 수 있다.

1. Dagger 보다 쉬운 기본 설정

2. 안드로이트 클래스 최적화

3. Life Cycle 관리 

 

1. Dagger 보다 쉬운 기본 설정

Dagger는 객체 주입을 위해서 Module, Componenet 두가지를 생성해줘야한다.

하지만  Hilt는 Module 하나만 생성하면 되며, Componenet는 안드로이드 클래스 단위로 사전에 생성되어있어 Annotation으로 쉽게 설정할 수 있다.

또한, Dagger를 Application에 사용하려면 수동으로 설정해줘야하는 작업이 있는데, Hilt는 Application Class에 @HiltAndroidApp만 추가하면 된다.

@HiltAndroidApp
class ExampleApplication : Application() { ... }

참고 - developer.android.com/training/dependency-injection/hilt-android#application-class

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성

developer.android.com

 

2. 안드로이드 클래스 최적화

Hilt는 Application, Activity, Fragment, ViewModel, View, Service 등 안드로이드 클래스에 최적화 되어있다.
사실 위에 나열된 안드로이드 클래스에서만 사용할 수 있도록 되어있다고 보는 것이 맞다.

Module을 생성하고, Module에서 제공하는 객체들을 어느 안드로이드 클래스에서 사용할 것인지 @InstallIn annotation으로 알려주기만하면 된다.

interface AnalyticsService {
  fun analyticsMethods()
}

// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
  ...
) : AnalyticsService { ... }

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {

  @Binds
  abstract fun bindAnalyticsService(
    analyticsServiceImpl: AnalyticsServiceImpl
  ): AnalyticsService
}

참고 - developer.android.com/training/dependency-injection/hilt-android#hilt-modules

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성

developer.android.com

 

3. Life Cycle 관리

Hilt는 인스턴스의 생명주기를 관리하기 위한 노력을 최소화 할 수 있습니다.

안드로이드 클래스에 최적화된 Hilt는 각 클래스의 생명주기에 따라 구성요소의 인스턴스를 생성 및 제거 해줍니다.

생성된 구성요소생성 위치제거 위치

ApplicationComponent Application#onCreate() Application#onDestroy()
ActivityRetainedComponent Activity#onCreate() Activity#onDestroy()
ActivityComponent Activity#onCreate() Activity#onDestroy()
FragmentComponent Fragment#onAttach() Fragment#onDestroy()
ViewComponent View#super() 제거된 뷰
ViewWithFragmentComponent View#super() 제거된 뷰
ServiceComponent Service#onCreate() Service#onDestroy()

또한 안드로이드 클래스 별 Scope도 지정할 수 있어 사용 범위에 따라 적절한 생명주기로 관리할 수 있습니다.

참고 - developer.android.com/training/dependency-injection/hilt-android#component-scopes

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성

developer.android.com

 

Hilt는 Dagger에 비하여 사용이 쉽고 안드로이드에 최적화되어있어 강력하다는 장점이 있다

하지만 이러한 Hilt도 모두 완벽한 것은 아니다.

단점을 아래와 같다.

 

1. Dagger를 모른다면 Hilt를 이해하기 어려운 것은 똑같다

 Hilt는 Dagger에 비하여 상용구가 적고 쉽게 사용할 수 있다는 장점이 있지만

인스턴스를 생성하고, 주입하기 위한 모습은 같거나 비슷하다.

그렇게 때문에 DI에 대하여 잘 모르거나 Dagger의 동장방식을 이해하지 못하였다면 Hilt를 이해하는 것은 똑같이 어렵다.

 Dagger를 베이스로 만들어진 Hilt이기에 이것은 당연한 것일지 모른다.

 

2. 안드로이드 클래스 외의 범위에서 사용하기 까다롭다

Hilt는 안드로이드 클래스에 최적화 되어있다.

이것은 Hilt의 최대 장점이자 단점이 된다.

프로젝트 규모에 따라 안드로이 클래스 외의 곳에 DI를 해줘야하는 경우가 분명히 생긴다.

Dagger의 경우, 안드로이드 클래스나 기타 클래스나 모두 동등한 방법으로 Dagger를 사용할 수 있지만

Hilt의 경우 Hilt가 지원하는 안드로이드 클래스 외의 곳에서 사용하려면 엄청 복잡하지는 않지만 부가적인 사용구를 추가해줘야한다

참고 - developer.android.com/training/dependency-injection/hilt-android#not-supported

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성

developer.android.com

 

CodeLab,  안드로이드 개발 가이드를 통해 간단하게 접해본 Hilt의 사용 후기는 아주 만족스러웠다.

Dagger를 어느정도 사용할 수 있는 개발자 입장에서 Hilt는 복잡해서 이해하기 어렵고 이해하기도 싫은 Dagger의 상용구를 줄여준다는 아주 강력한 장점이 있으면서, 안드로이드에 최적화 되어있어 앱을 개발할 때 개발 시간 단축 및 리소스 관리에 큰 역할을 해줄 수 있을 것 같다는 생각이 들었다.

아직 베타 버전의 Hilt인데, 안드로이드 개발자 DI 세선에 첫번째는 Hilt가 차지하고있다 (그 아래 Dagger)

구글이 Hilt에 얼마나 큰 힘을 들이고 있는 것인지 알 수 있는 부분인 것 같다.

Hilt를 꾸준히 접하고 사용해봐야겠다.

 

Hilt 배우기

1. Google CodeLab

구글이 만들어놓은 시나리오를 단계별로 따라하면서 Hilt를 효과적으로 이해할 수 있는 장점이 있다.

단순 사용법만을 알려주는 것이 아니고 왜 저렇게 해야하는지, 이렇게 하면 왜 에러가 발생하는지 자세하게 설명되어있어 아주 효과적이다.

Hilt Code Lab -  codelabs.developers.google.com/codelabs/android-hilt#0

 

Using Hilt in your Android app  |  Google Codelabs

In this codelab, you’ll build an Android app that uses Hilt to do Dependency Injection.

codelabs.developers.google.com

Dagger를 미리 접하거나 이해한다면 Hilt를 이해하는데 큰 도움이 될 것이다.

Dagger Code Lab - developer.android.com/codelabs/android-dagger#0

 

Using Dagger in your Android app - Kotlin  |  Android 개발자

In this codelab, you’ll build an Android app that uses Dagger to do Dependency Injection.

developer.android.com

 

2. 안드로이드 개발자 가이드

레퍼런스 문서는 언제나 옳다.

Hilt에 대하여 상세하게 설명되어있으니 한번 읽어보길 추천한다.

외에 DI와 Dagger에 대한 내용도 포함되어있으니 함께 읽어보면 좋다.

developer.android.com/training/dependency-injection/hilt-android#not-supported

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성

developer.android.com

 

댓글