Hilt(Dagger)에서 의미하는 component는 module들과 injection을 묶어주는 역할을 한다. Hilt는 constructor injection의 경우 이에 맞게 component를 생성해주고, module로 만들 때는 내가 선언한 스코프에 맞게 component를 만들어준다.
Component 종류
- ApplicationComponent,
- ActivityComponent,
- ActivityRetainedComponent (ViewModel과 관련),
- FragmentComponent,
- ViewComponent,
- ViewWithFragementComponent (@WithFragmentBindings와 관련),
- ServiceComponent
해당 스코프의 생명주기에 따라서 component도 생성과 소멸된다.
모든 모듈에서 만든 의존성들은 scope를 따로 선언하지 않을 경우 unscoped 되어있다. 즉 의존성을 부를 때마다 새로운 객체를 생성할 것이다.
아래의 표에서 자신의 스코프에서
위 표의 SingletonComponent는 ApplicationComponent와 같다. 이부분은 확실하지는 않다...
현재 ApplicationComponent 대신 SingletoComponent로 표현이 최신화된 것 같다. 물론 두가지 스코프 모두 사용할 수 있다.
@Module
@InstallIn(ActivityComponent::class)
class NetworkProvideModule {
// @Provides
// fun provideNetworkService() : NetworkService{
// return NetworkService.Builder()
// .host("google.com")
// .protocol("HTTPS")
// .build()
// }
@CallInterceptor
@Provides
fun provideCallNetworkService() : NetworkService{
return NetworkService.Builder()
.host("google.com")
.protocol("HTTPS")
.interceptor(CallInterceptorImpl())
.build()
}
@ResponseInterceptor
@Provides
fun provideResponseNetworkService() : NetworkService{
return NetworkService.Builder()
.host("google.com")
.protocol("HTTPS")
.interceptor(ResponseInterceptorImpl())
.build()
}
}
해당 모듈들의 스코프는 기본적으로 부를 때마다 새로이 객체를 생성한다. 이를 싱글톤 형태로 액티비티 내에서 부를 때마다 같은 객체로 만드려면 표를 참고하여 activityscoped라는 한 액티비티 내에서 주입할 때 같은 객체만을 전달
하는 의미의 애너테이션을 사용하면 된다.
@CallInterceptor
@Provides
@ActivityScoped
fun provideCallNetworkService() : NetworkService{
return NetworkService.Builder()
.host("google.com")
.protocol("HTTPS")
.interceptor(CallInterceptorImpl())
.build()
}
@ResponseInterceptor
@Provides
@ActivityScoped
fun provideResponseNetworkService() : NetworkService{
return NetworkService.Builder()
.host("google.com")
.protocol("HTTPS")
.interceptor(ResponseInterceptorImpl())
.build()
}
Component는 위와 같은 계층 구조를 가진다. 하위 컴포넌트는 자신의 상위 컴포넌트에 접근할 수 있다는 뜻이다.
예를 들어 하위 컴포넌트인 ActivityComponent는 자신의 상위 컴포넌트인 SingletonComponent, ActivityRetainedComponent 등에 접근할 수 있다.
내가 어떤 fragment에서 fragmentScoped로 선언한 객체들도 불러오고, ActivityScoped에서 선언 객체들도 불러오고 할 수 있는 것이다.