[Android] DI - Hilt

elliot·2021년 9월 5일
0

Android

목록 보기
7/7
post-thumbnail

Hilt

설명

많은 개발자들이 지금까지 구글에서 Jetpack을 통해 제공하고 있는 의존성 주입 라이브러리 Dagger2를 사용해 왔다. 여러 장점에도 불구하고 높은 학습비용과 많은 보일러 플레이트 코드를 생성해야 하는 단점으로 적용하기에 불편했던 것이 사실이다. 이에 대해 구글에서는 최근 Hilt라는 라이브러리를 공개하였다.

@HiltAndroidApp

@HiltAndroidApp
class RootApplication: Application() {
    ...
}
  • Hilt를 사용하고자 하는 앱은 @HiltAndroidApp으로 주석이 지정된 Application 클래스를 추가해야 한다.
  • @HiltAndroidApp은 기존 Dagger2에서 ApplicationComponent를 정의하고 Application 내 코드로 초기화하던 과정에 해당한다.

@Modul, @Installin, @Provides

@Module
@InstallIn(ApplicationComponent::class)
object ApiModule {

    @Singleton
    @Provides
    fun provideApiService(okHttpClient: OkHttpClient): ApiService {
        ...
    }

    @Singleton
    @Provides
    fun provideRepository(apiService: ApiService): Repository = ApiRepository(apiService)
}
  • Module은 @Provides나 @Binds로 생성한다.
  • @InstallIn을 사용하여 표준 Component를 설정한다.
  • 표준 Component에는 ApplicationComponent, ActivityComponent, FragmentComponent, ViewComponent, ServiceComponent 등이 있다.
  • Hilt는 @Inject를 요청할 때마다 새 인스턴스를 생성하므로, 동일한 인스턴스를 원하는 경우는 Component별로 정의된 Scope을 지정해 주면 된다.

@AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var repositoty: Repository
    private val viewModel by viewModels<MainViewModel>()
    ...
}
  • Hilt는 @AndroidEntryPoint 주석이 있는 클래스에 종속 항목을 제공할 수 있다.
  • 프래그먼트에 주석을 지정하면 이 프래그먼트를 사용하는 Activity에도 주석을 지정해야 한다.

@ViewModelInject

class MainViewModel @ViewModelInject constructor(val repository: Repository): ViewModel() {

    fun fetchImages(searchText: String) {
        repository.fetchImages(searchText)
        ...
    }
}
  • Hilt에서는 @ViewModelInject를 붙여주는 걸로 ViewModel 주입이 가능하다.
profile
성장하는 개발자

0개의 댓글