지금까지는 하나의 컴포넌트만 사용하였다.
하지만, 안드로이드 프레임워크 같은 곳에서는 여러 컴포넌트들 간에 의존 관계가 필수적이다. 어플리케이션은 여러 액티비티(Activity)를 포함하며, 각 액티비티는 여러 프레그먼트(Fragment)를 포함할 수 있다.
즉, 각 Component들은 의존 관계가 생긴다. 따라서 의존 관계가 있는 컴포넌트는 상위 컴포넌트에 대한 참조를 포함해야 한다.
Dagger2에서는 이를 위해 모듈에 포함할 수 있고, 상위 프로바이더를 사용할 수 있는 서프컴포넌트를 제공한다.
서브 컴포넌트(SubComponent)
서브 컴포넌트란 어떤 컴포넌트의 하위에 포함되는 컴포넌트를 뜻한다. 정확히는 모듈 내부에 포함되는데, 이를 통해 해당 서브컴포넌트는 부모 모듈과 컴포넌트의 프로바이더를 모두 사용할 수 있게 된다.
안드로이드를 예로 들면 서브 컴포넌트는 <그림2>와 같을 수 있다. Application Component가 최상단에 있고, 해당 컴포넌트는 ApplicationModule을 포함한다. 이 모듈은 SubComponent로 Acitivty SubComponent를 포함해서 Activity Component는 Application Component와 Application Module의 프로바이더를 참조할 수 있게 된다. Fragment SubComponent 또한 마찬가지로 Activity Module, Activity SubComponent, Application Module, Application Component의 프로바이더를 참조할 수 있게 된다.
서브 컴포넌트 만들기(예제10)
예제 링크 : https://github.com/seyoungcho2/Dagger2Example
<그림2>에서 Provider을 뺀 구조를 만들어보자.
예제10의 코드 구조는 다음과 같다.
AppComponent 설정
AppComponent 내부에 AppModule을 포함한다. AppModule은 서브 컴포넌트로 ActivitySubComponent를 가진다.
@Component(modules = [AppModule::class])
interface AppComponent {}
@Module(subcomponents = [ActivitySubComponent::class])
class AppModule {}
ActivitySubComponent설정
ActivitySubComponent는 모듈로 ActivityModule을 가진다. SubComponent에는 항상 빌더나 팩토리를 만들어주어야 한다. 빌더는 https://kotlinworld.com/108 에서 살펴보도록 한다. ActivityModule은 FragmentComponent를 서브컴포넌트로 가진다.
@Subcomponent(modules = [ActivityModule::class])
interface ActivitySubComponent {
@Subcomponent.Builder
interface Builder {
fun build(): ActivitySubComponent
}
}
@Module(subcomponents = [FragmentComponent::class])
class ActivityModule {}
FragmentSubComponent설정
ActivitySubComponent와 같다.
@Subcomponent(modules = [FragmentModule::class])
interface FragmentSubComponent {
@Subcomponent.Builder
interface Builder {
fun build(): FragmentSubComponent
}
}
@Module
class FragmentModule {}
이 방식으로 <그림2>의 오브젝트 그래프에서 Provider을 뺀 것을 완성하였다.
서브컴포넌트를 이용해 컴포넌트간 의존성 설정이 가능하다.