Image
Android/Dependency Injection

[Dagger2] 9. SubComponent를 이용해 컴포넌트간 의존 관계 설정

지금까지는 하나의 컴포넌트만 사용하였다.

 

하지만, 안드로이드 프레임워크 같은 곳에서는 여러 컴포넌트들 간에 의존 관계가 필수적이다. 어플리케이션은 여러 액티비티(Activity)를 포함하며, 각 액티비티는 여러 프레그먼트(Fragment)를 포함할 수 있다.

 

그림1. Android 의존 관계

즉, 각 Component들은 의존 관계가 생긴다. 따라서 의존 관계가 있는 컴포넌트는 상위 컴포넌트에 대한 참조를 포함해야 한다. 

 

Dagger2에서는 이를 위해 모듈에 포함할 수 있고, 상위 프로바이더를 사용할 수 있는 서프컴포넌트를 제공한다. 

 

서브 컴포넌트(SubComponent)

그림2. 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의 코드 구조는 다음과 같다.

그림3. SubComponent 예제

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을 뺀 것을 완성하였다.

 

서브컴포넌트를 이용해 컴포넌트간 의존성 설정이 가능하다.
반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com