Mobile/Android(Kotlin)

[Android] Concept of DI Hilt. Dive into Hilt Components.

개발왕 금골드 2022. 11. 22. 23:17
반응형

Component Hierarchy

  • 기존 Dagger와 달리 Hilt 사용자는 Dagger의 Components를 직접 정의하거나 인스턴스화하지 않는다.
  • 대신 Hilt는 사용자를 위해 생성되는 미리 정의된 Components를 제공한다.
  • Hilt는 안드로이드 애플리케이션의 다양한 라이프 사이클에 맞춰 자동으로 통합되는 Components(및 해당 Scope Annotaion) 세트가 제공된다.
  • 아래 Diagram은 Hilt Component의 계층 구성도를 보여준다. 각 Component의 주석은 해당 Component의 수명으로 바인딩 범위를 지정하는 데 사용되는 범위 지정 주석이다.
  • Component의 화살표는 하위 Components를 가리킨다. 일반적으로 하위 Components의 바인딩은 상위 Components의 바인딩에 종속될 수 있다.
  • @InstallIn Module 내 바인딩 범위를 지정할 때 바인딩의 범위는 Components의 범위와 일치해야 한다.

Components used for Injection

  • @AndroidEntryPoint와 같은 Hilt API를 사용하여 Android class를 주입할 때 표준 Hilt Components가 Injector로 사용된다.
  • Injector로 사용되는 Components는 해당 Android class에 표시되는 바인딩을 결정한다.

Component lifetimes

  • Components가 생성되고 삭제된 시점 사이로 scoped bindings의 생명주기를 제한한다.
  • 생명주기는 members가 주입한 값을 사용할 수 시기를 나타낸다.
  • 아래 표는 각 Component에 대한 Scoping과 제한된 생명주기를 나타낸다.

  • Dagger는 기본적으로 unscoped이다. 그렇기 때문에 binding이 요청될 때마다 Dagger가 새로운 Binding Instance를 생성한다.
  • 그러나, Dagger 역시 component를 scoped로 지정할 수 있다. scoped binding은 지정된 component의 Instance당 한 번만 생성되며 해당 binding에 대한 모든 요청은 동일한 Instance를 공유한다.
  • 모듈에서 생성된 binding 역시 범위를 지정할 수 있다. 범위 주석이 달린 binding 선언만 범위가 지정된다.
@Module
@InstallIn(FragmentComponent.class)
object FooModule {
  // This binding is "unscoped".
  @Provides
  fun provideUnscopedBinding() = UnscopedBinding()

  // This binding is "scoped".
  @Provides
  @FragmentScoped
  fun provideScopedBinding() = ScopedBinding()
}
  • 범위 지정은 생성된 코드의 크기와 런타임 성능 모두에 비용이 든다. 때문에 일반적으로 정확히 필요한 경우에만 사용한다.

Component default bindings

 
참고자료 :
https://dagger.dev/hilt/components.html#component-hierarchy

 

Hilt Components

Note: The following page assumes a basic knowledge of Dagger, including components, modules, scopes, and bindings. (For a refresher, see Dagger users guide.) Component hierarchy Unlike traditional Dagger, Hilt users never define or instantiate Dagger compo

dagger.dev

 

반응형