-Hilt는 표준 컴포넌트를 제공하기 때문에 개발자가 직접 컴포넌트를 정의하지는 않는다. 굳이 하겠다면 custom 컴포넌트를 정의하려면 정의 할 수 있기는 하지만 굳이 사용 안한다.
-각 컴포넌트 계층 이미지에 보이는 각각의 Component의 명칭 위에 있는 ???Scoped 어노테이션은 해당 컴포넌트의 생명주기에 대한 의존성범위를 지정할 때 사용되는 Annotation이다.
-화살표가 아래방향으로 향하고 있는데 이 Component간의 화살표 방향은 하위 컴포넌트를 가르키는 것을 의미한다. 일반적으로 하위 컴포넌트는 상위 컴포넌트의 바인딩에 접근 할 수 있다. 하지만 상위 컴포넌트는 상위 컴포넌트의 바인딩에 접근 할 수 없다. 이러한 의존관계 또한 컴파일단에서 전부 체크하므로 문제가 있으면 빌드를 중단시키고 런타임의 안정성을 확보한다.
-필드 삽입을 실행할 수 있는 각 Android 클래스마다 @InstallIn 주석에 참조할 수 있는 관련 Hilt 구성요소가 있다. 각 Hilt 구성요소는 해당 Android 클래스에 결합을 삽입해야 한다.
-Application 클래스를 위한 SingletonComponent를 제외하고는 안드로이드 컴포넌트에서는 AndroidEntryPoint 어노테이션을 통해서 아래와 같은 컴포넌트 들을 생성해서 의존성을 주입할 수 있다. 이로서 각각의 안드로이드 컴포넌트들은 독립적으로 의존성을 주입받을 수 있게 된다.
-Hilt Component의 생명주기는 해당 컴포넌트에 바인딩 된 의존성들의 수명과 관련이 있다. 위의 도표를 보면 Hilt Component가 언제 생성이 되고 언제 소멸이 되는지 알 수 있다. 안드로이드 컴포넌트에서 의존성 주입을 시도 할 때 Hilt Component가 인스턴스화 되기 이전 또는 이후에 의존성 주입을 시도하면 에러가 발생 할 수 도 있다. 따라서 Hilt Component의 생성 소멸을 반드시 알고 있어야 한다.
-Hilt에서는 Scope Annotation을 사용하지 않으면 매번 새로운 인스턴스를 생성할 것을 암시한다.
-Hilt를 사용할 때 각각의 의존성 주입 요청에 대해 매번 새로운 인스턴스를 생성하는 대신, Scope Annotation을 사용하면 특정 범위 내에서 동일한 인스턴스를 재사용할 수 있다.
-만약 Scope Annotation을 마킹하면 의존성은 Scope에 해당하는 컴포넌트 생명주기 동안에 동일하게 참조가 된다. 즉, @???Scoped 어노테이션이 마킹이 되면 해당 Hilt 컴포넌트의 생명주기 동안 매 요청에 대해서 동일한 인스턴스의 반환을 보장한다. 그러나 실제로 모든 컴포넌트에서 동일한 인스턴스를 반환하고 싶으면 더 상위 레벨의 컴포넌트에 Scope를 마킹해야 한다.
-1. 의존성을 인스턴스화하는 비용이 클 때
-2.동일한 인스턴스를 반환하고 싶을 때
-3.특정 인스턴스를 공유하고 싶을 때
-위의 사진은 Hilt에서 Component가 기본적으로 제공하는 바인딩을 나타내는 사진이다.
-개별적인 HiltComponent들은 몇가지 기본 바인딩을 제공한다.
-Component는 그냥 생략하고 생각하면 된다.
@Singleton
@Component(modules = [...])
interface AppComponent {
> Application context를 주입할 때 사용한다.
fun inject(application: Application)
}
ActivityRetainedComponent : 액티비티가 종료되고 재생성될 때까지 데이터를 유지하기 위해 사용한다.
ViewModelComponent : SavedStateHandle과 함께 뷰 모델의 상태를 관리하고 유지하는 데 사용한다.
ActivityComponent : 액티비티의 생명주기에 맞춰 의존성을 관리할 때 사용한다.
FragmentComponent : 액티비티와 프래그먼트가 공유하는 의존성을 관리할 때 사용한다.
ViewComponent : 뷰 내에서 사용될 의존성을 관리할 때 사용한다.
@HiltViewModel
class MyViewModel @Inject constructor(
val savedStateHandle: SavedStateHandle,
val repository: UserRepository
) : ViewModel() {
> ViewModel과 관련된 의존성을 주입할 때 사용한다.
}
ViewWithFragmentComponent : 뷰와 프래그먼트가 복잡하게 얽혀 있을 때 사용한다.
ServiceComponent : 백그라운드 작업이나 장기 실행 서비스에 대한 의존성을 관리할 때 사용한다.
@AndroidEntryPoint
class MyService : Service() {
> Service에 필요한 의존성을 주입한다.
@Inject lateinit var notificationManager: NotificationManager
}