[안드로이드 Hilt 4] - Component와 Scope

이영준·2023년 7월 10일
1

안드로이드_Hilt

목록 보기
4/5

Component란?

Hilt(Dagger)에서 의미하는 component는 module들과 injection을 묶어주는 역할을 한다. Hilt는 constructor injection의 경우 이에 맞게 component를 생성해주고, module로 만들 때는 내가 선언한 스코프에 맞게 component를 만들어준다.

Component 종류

  • ApplicationComponent,
  • ActivityComponent,
  • ActivityRetainedComponent (ViewModel과 관련),
  • FragmentComponent,
  • ViewComponent,
  • ViewWithFragementComponent (@WithFragmentBindings와 관련),
  • ServiceComponent

Component lifetime


해당 스코프의 생명주기에 따라서 component도 생성과 소멸된다.

Component의 Scope

모든 모듈에서 만든 의존성들은 scope를 따로 선언하지 않을 경우 unscoped 되어있다. 즉 의존성을 부를 때마다 새로운 객체를 생성할 것이다.

아래의 표에서 자신의 스코프에서

위 표의 SingletonComponent는 ApplicationComponent와 같다. 이부분은 확실하지는 않다...
현재 ApplicationComponent 대신 SingletoComponent로 표현이 최신화된 것 같다. 물론 두가지 스코프 모두 사용할 수 있다.

ActivityComponent에 속한 module 여러개 부르기

@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 Hierarchy


Component는 위와 같은 계층 구조를 가진다. 하위 컴포넌트는 자신의 상위 컴포넌트에 접근할 수 있다는 뜻이다.
예를 들어 하위 컴포넌트인 ActivityComponent는 자신의 상위 컴포넌트인 SingletonComponent, ActivityRetainedComponent 등에 접근할 수 있다.

내가 어떤 fragment에서 fragmentScoped로 선언한 객체들도 불러오고, ActivityScoped에서 선언 객체들도 불러오고 할 수 있는 것이다.

profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글