Photo by Anis Rahman on Unsplash

 

다들 "단검"🗡 많이 사용해 보셨나요?? 

"단검 칼자루"⚔️는 많이 만져보셨나요??

 

갑자기 시작부터 이상한 소리인가 하시겠지만

저는 요즘 핫한 Android DI "Dagger""Hilt"에 대하여

물어보고 있었습니다.  💁‍♂️💁‍♂️

 

 

Dagger / Hilt

 

오늘은 그중에서 Hilt에 대하여 알아보겠습니다.

 

 

✔️ Hilt
✔️ Koin vs Hilt
✔️ lib 적용
✔️ @HiltAndroidApp
✔️ @AndriodEntryPoint
✔️ 의존성 주입 방법

✔️ @ActivityContext / @ApplicationContext

 

 

 

Android DI Hilt 적용하기 (Binds, Provides, ApplicationContext)

Photo by Anis Rahman on Unsplash 프로젝트에 Hilt를 적용하다 막히셨나요? 🤷‍♂️🤷‍♂️ Hilt에 사용되는 @Binds, @Provides 적용에 도움되는 내용을 준비했습니다. (도움이 되었으면... 좋겠네요..❗️)

salmonpack.tistory.com

 


 

🗡 Hilt

 

위에서 보여드린것 처럼 DaggerHilt는 연관있습니다.

Hilt는 Google에서 제공하는 DI 라이브러리 Dagger를 기반으로 빌드되었습니다.

 

먼저 Hilt의 정의를 살펴보면

 

Hilt는 Android에서 종속 항목을 삽입하기 위한 Jetpack 권장 라이브러리입니다.

프로젝트의 모든 Android 클래스에 컨테이너를 제공하고 수명 주기를 자동으로 관리함으로써

애플리케이션에서 DI를 실행하는 표준 방법을 정의합니다.

 

이해가 되시나요? 말이 너무 어렵죠?

우선 Google Jetpack에서 제공하는

DI 라이브러리라고 생각하고 조금 더 살펴보면서

알아가도록 해봅시다.

 

 

 

 

Android DI(Dependency Injection) 의존성 주입이 뭐지?

🔥🔥 요즘 아주 핫한 키워드 중 하나죠! DI (Dependency Injection) 종속 항목 주입 또는 의존성 주입 프로그래밍에 널리 사용되는 기법이고 Android 개발에 적합하다고 하는데요 via GIPHY DI? Koin? Dagger? Hil

salmonpack.tistory.com

 

 


 

🆚 Koin vs Hilt

 

 

요즘 Android DI 하면 가장 많이 접하는 단어입니다.

Koin / Hilt

 

Koin과 Hilt는 둘 다 Android DI패턴을 도와주며

Dagger보다 낮은 러닝 커브를 자랑합니다.

 

하지만 몇몇 차이점이 존재합니다.

 

우선 제가 느낌 가장 큰 차이점은 바로

Android Studio에서 종속 관계 표시 유무입니다.

 

(왼쪽 이미지) Hilt 적용 프로젝트 / (오른쪽 이미지) Koin 적용 프로젝트

 

좌측 Hilt 적용 프로젝트를 보시면 WeatherRepository의 생성자에 종속 주입을 하고 있습니다.

해당 생성자 좌측을 보시면 Koin과 다르게 아이콘을 확인할 수 있습니다.

해당 아이콘을 눌러보시면 종속관계에 있는 클래스 파일을 Android Studio에서 열어 확인 할 수 있습니다.

(Hilt는 Google의 지원을 받기 때문에 Android Studio에서 기능을 지원하는 게 아닌가 추측해 봅니다.)

 

반면 Koin은!

 

WeatherRepository에서는 종속관계에 있는 클래스 파일이 어떤 것인지 확인하기 힘들고

Koin Module 선언된 파일을 찾아가 타고 타고 하나씩 직접 추적해야 합니다.

복잡하지 않은 프로젝트라면 간단하게 추적할 수 있겠지만

로직이 복잡하고 종속관계가 많은 프로젝트일 경우 상상만 해도 끔찍합니다.

 

종속 관계 아이콘뿐 아니라 Hilt는 종속 주입 시 @Inject를 붙여 주입하는 부분을 모두 표시하지만

Koin은 어디에서 언제 주입이 되었는지 어디에 영향이 있는지 알기 어렵습니다.

 

또 한 가지 큰 차이점이라면

Hilt는 컴파일 시 종속 주입이 진행되고

Koin은 런타임 시 주입을 시도합니다.

그렇기 때문에 Koin은 실행 직후 알 수 없는 오류에 빠지게 됩니다.

 

 

 

Koin에 대하여

 

[Kotlin] Android Koin을 활용하여 DI 적용 (경량화 DI Koin)

요즘 아주 자주 보이는 DI 종속 항목 삽입의 개념을 알고자 간단한 프로젝트를 생성하여 Koin을 이용한 DI를 적용해봤습니다. (조용히 숨만 쉬고 사는데도 배워야 할 앱 개발 지식은 끝이 없네요...

salmonpack.tistory.com

 

 


 

✔️ lib 적용

 

자 그렇다면 이제 Hilt를 사용해보겠습니다.

 

build.gradle(Project)

plugins {
  ...
  id 'com.google.dagger.hilt.android' version '2.44' apply false
}

 

build.gradle(Module)

...
plugins {
  id 'kotlin-kapt'
  id 'com.google.dagger.hilt.android'
}

android {
  ...
}

dependencies {
  implementation "com.google.dagger:hilt-android:2.44"
  kapt "com.google.dagger:hilt-compiler:2.44"
}

// Allow references to generated code
kapt {
  correctErrorTypes true
}

 

혹시나 Hilt 라이브러리를 적용하던 중

ComponentProcessingStep was unable to process 'packagename.SingletonC' because

'dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory' could not be resolved. 

 

위와 같은 오류 발생 시

저처럼 이전 버전의 hilt 라이브러리를 사용하면서

제거하지 않은 라이브러리가 있는지 확인해야 합니다.

 

저는 "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"

이와 같은 라이브러리를 제거하였더니 해결되었습니다.

 

 

Android Hilt 라이브러리 충돌 오류

🚫🚫 ComponentProcessingStep was unable to process 'packagename.SingletonC' because 'dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory' could not be resolved. 두둥... via GIPHY 🤦‍♂️🤦‍♂️🤦‍♂️ 요즘 Andro

salmonpack.tistory.com

 


 

✔️ @HiltAndroidApp

 

Hilt를 사용하기 위해서는 @HiltAndroidApp으로 주석이 지정된 Application 클래스가 필요합니다.

@HiltAndroidApp은 애플리케이션 수준 종속 항목 컨테이너 역할을 하는

애플리케이션의 기본 클래스를 비롯하여 Hilt의 코드 생성을 트리거합니다.

 

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

 

그 후 Manifest 파일에 name속성으로 Application 파일을 추가해줍니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest>

    ...

    <application
        ...
        android:name=".ExampleApplication"
        ... >
        
        
 </manifest>

 


 

✔️ @AndriodEntryPoint

 

종속 주입이 필요한 Activity에는 @AndroidEntryPoint 주석으로 선언하여

Hilt 주입에 필요한 구성요소를 생성합니다.

 

구성요소에 종속 항목을 가져오려면 @Inject 주석을 사용하여 필드 삽입을 진행합니다.

또한 삽입한 필드는 비공개일 수 없습니다.(private 변수일 수 없습니다.)

 

위에서 말해드린 것처럼 Hilt는 컴파일 시 주입되기 때문에

비공개 필드를 선언하면 컴파일 오류가 발생합니다.

 

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { 
	
    @Inject lateinit var analytics: AnalyticsAdapter
    ...
}

 

 


 

💉 의존성 주입 방법

 

의존성 주입은 두 가지 방법이 있습니다.

하나는 생성자 주입이고 다른 하나는 필드 주입입니다.

위에서 보셨던 예제는 필드 주입입니다.

 

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { 
	
    @Inject lateinit var analytics: AnalyticsAdapter
    ...
}

 

생성자 주입과 비교해보겠습니다.

 

class AnalyticsAdapter @Inject constructor(
    private val service: AnalyticsService
) { ... }

 


 

 

✔️ @ActivityContext / @ApplicationContext

 

Hilt는 사전 정의된 한정자를 제공합니다.

작업을 하시다 보면 Activity가 아닌 곳에서 

Context가 필요한 경우가 있습니다.

이때 해당 Context를 생성자 주입하여 바로 사용 가능합니다.

 

class AnalyticsAdapter @Inject constructor(
    @ActivityContext private val context: Context,
    private val service: AnalyticsService
) { ... }

 

 

 

Android DI Hilt 적용하기 (Binds, Provides, ApplicationContext)

Photo by Anis Rahman on Unsplash 프로젝트에 Hilt를 적용하다 막히셨나요? 🤷‍♂️🤷‍♂️ Hilt에 사용되는 @Binds, @Provides 적용에 도움되는 내용을 준비했습니다. (도움이 되었으면... 좋겠네요..❗️)

salmonpack.tistory.com

 

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해보겠습니다.

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기