Hilt란?

Android용 DI(Dpependency Injection: 의존성 주입) 프레임 워크로, Google이 안드로이드 개발을 위해 Dagger를 기반으로 제공하는 Library이다. Dagger의 복잡한 설정을 단순화 하여 의존성 주입을 쉽게 사용 할 수 있도록 도와준다.

Hilt를 사용하는 이유

  1. 의존성 관리의 효율화
  2. → Hilt는 객체의 생성과 라이프사이클을 자동으로 처리하기 때문에 개발자가 수동으로 의존성을 생성하고 관리할 필요가 없음. Activity, Fragment, ViewModel등의 컴포넌트와 자연스럽게 통합됨
  3. 코드 재사용성 증가
  4. →Hilt는 Module을 통해 의존성을 정의하여 여러 클래스에서 같은 의존성을 쉽게 재사용할 수 있음
  5. 테스트 편의성 향상
  6. → 의존성을 주입하기 때문에 실제 객체 대신 목객체를 쉽게 주입하여 테스트를 단순화할 수 있음

Hilt의 종류

  • @HiltAndroidApp (Application)
  • Hilt를 사용하는 모든앱은 Application Class에 해당 어노테이션을 적용해야 함 (Hilt의 코드 생성을 트리거 시킴)
  • @AndroidEntryPoint (Activity, Fragment)@AndroidEntryPoint가 지정된 Service를 사용하는 Activity에도 @AndroidEntryPoint를 지정해야 함
  • Android Component(Activity, Fragment, View, Service, BroadcastReceiver)에 사용할 수 있는 어노테이션으로 @Inject가 달린 필드에 의존성 주입을 한다.
  • @EntryPoint
  • @AndroidEntryPoint를 사용하는곳이 아닌 다른곳에서 의존성주입이 필요한 경우에 사용한다.
  • @Module (Interface나 외부 Library)
  • Interface, Builder Pattern을 사용한 경우(외부 라이브러리 클래스 및)에 사용하며 객체 생성 방법을 정의하여 @Inject가 가능하도록 만들어 준다.
  • @InstallIn (해당 모듈을 지정한 컴포넌트에 설치)
    @Module
    @InstallIn(ActivityComponent::class)
    abstract class CalculatorModule {
    
        @Binds
        abstract fun bindCalculator(impl: CalculatorImpl): Calculator
    
    }
    
    @InstallIn에 들어가는 컴포넌트 종류
    1. SingletonComponent::class → 앱 전체 싱글톤으로 유지되는 객체를 주입 (앱이 켜져있는 동안 유지) → 주로 앱 전체에 유지되는 객체를
    2. ActivityRetainedComponet::class → 액티비티가 살아있는 동안 유지(화면회전시에도 유지)
    3. ActivityComponent::class → 액티비티 생명주기에 맞춰서 생성/파괴
    4. FragmentComponet::class → 프래그먼트 생명주기에 맞춰서 생성/파괴
    5. ViewComponent::class → 안드로이드 View 생명주기에 맞춰서 생성/파괴
    6. ViewModelComponent::class → ViewModel의 생명주기에 맞춰서 생성/파괴
    7. ServiceComponent::class → 서비스 생명주기에 맞춰서 생성/파괴
  • @Module이나 @EntryPoint 어노테이션과 함께 사용해야 하며 @InstallIn을 이용해서 모듈을 어느 컴포넌트에 설치할지 정할 수 있다.
  • @Binds (Interface의 구현체)
  • 인터페이스와 구현체간에 연결을 해준다. (추상 클래스, 추상 함수만 가능)
  • @Provides
  • 복잡한 객체 생성시 사용하며 함수 안에서 직접 구현체를 생성 한다. 일반 클래스나 객체에서 사용 가능
  • @ Inject클래스 간 의존성을 명확히 분리할 수 있어 코드의 결합도를 낮출 수 있음
  • 생성자, 필드, 메서드에 사용 가능

Hilt 적용

Interface, Retrofit, ViewModel에서 주로 사용 됨

  • libs.versions.toml
  • [versions]
     hilt = "2.49" hiltPlugin = "2.49"
  • [libraries]
  • hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt"}
  • hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt"} 
  • [plugins]
  • hilt = { id = "com.google.dagger.hilt.android", version.ref = "hiltPlugin" }
  •  
  • build.gradle.kts(:app)
  • plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.hilt) id("kotlin-kapt") } android { hilt { enableAggregatingTask = false } } dependencies { //hilt implementation(libs.hilt.android) kapt(libs.hilt.compiler) }
  •  
  • 빌드 오류Unable to find method ''java.lang.String com.squareup.javapoet.ClassName.canonicalName()'' 'java.lang.String com.squareup.javapoet.ClassName.canonicalName()'해결 방법build.gradle(:app)모듈에 enableAggregatingTask 코드를 추가한다.
  •  
  • android{ hilt { enableAggregatingTask = false } }
  • 방법1
  • 오류 원인 최신 버전의 hilt에서는 클래스 경로를 집계(aggregate)하는 용도로 JavaPoet를 사용한다. javapoet의 'java.lang.String com.squareup.javapoet.ClassName.canonicalName()'을 찾지 못하는 것이 오류의 원인이다.
  • 오류 현상

@HiltAndroidApp 등록 → @AndroidEntryPoint 등록 → Interfac, Interface Module, InterfaceImpl 생성 →Interface Impl(@Inject 사용), InterfaceModule(@Module, @InstallIn, @Bind or @Provides@Singleton)

Activity, Fragment → @AndroidEntryPoint

ViewModel → @HiltViewModel

+ Recent posts