Android

[Android] Hilt @Binds, @Providers 차이점

Darane 2021. 9. 27. 11:39

Android에서 의존성 주입(DI / Dependency Injection)을 도와주기 위해서 Hilt 라이브러리를 제공해 줍니다.

 

Hilt 라이브러리를 사용하면 의존성 주입을 위해 Android 프로젝트에 컨테이너를 제공하고 수명 주기(Life cycle)를 자동으로 관리하여 불필요한 클래스 생성이나 자원관리에 도움을 받을 수 있습니다.

 

Hilt 모듈

Hilt 라이브러리에서 Constructor-inject(생성자 삽입) 삽입을 할 수 없는 경우

Hilt 모듈(@Module)을 사용하여 Hilt에 Binding 정보를 제공해줄 수 있습니다.

이때 Hilt 모듈은 @Binds와 @Providers로 Hilt binding 정보를 제공해줄 수 있습니다.

 

 

@Binds와 @Providers의 눈에 보이는 큰 차이점은

@Binds는 인터페이스 인스턴스(Interface instance)를 제공하는 것이고

@Provider는 클래스의 인스턴스(소유하지 않은 클래스)를 제공하는 것입니다.

 

 

추가로 살펴보면

인터페이스의 경우 바로 인스턴스를 생성할 수 없기 때문에

@Binds를 사용하여 인터페이스 인스턴스를 제공할 때 실제 사용되는 구현(Interface를 실제 구현한 클래스)을 Hilt에 알려줍니다.

 

 

 

@Binds

@Binds는 Hilt에 아래 정보를 알려줍니다.

    함수 Return type : 인스턴스(Instance)로 제공되는 인터페이스
    함수 매개변수(Parameter) : 실제 제공하는 클래스(구현)    

@Module
@InstallIn(SingletonComponent::class)
abstract class ServiceModule {
    @Binds
    @Singleton
    abstract fun provideServiceHelper(threeServiceHelper: ThreeServiceHelper): ServiceHelper
}

 

 

@Providers

@Providers는 의존성을 삽입하려는 클래스가 외부 라이브러리에서 제공되어 클래스를 소유하지 않은 경우(Retrofit이나 Room database)나 빌드 패턴 등의 인스턴스를 생성해야하는 경우 사용됩니다.

 

    함수 Return type : 제공하는 인스턴스
    함수 매개변수(Parameter) : 인스턴스의 종속 항목

    함수 Body: 인스턴스를 제공하는 방법

@Module
@InstallIn(ActivityComponent::class)
object AppModule {
    @Provides
    fun provideRetrofitService(): RetrofitService {
        return Retrofit.Builder()
            .baseUrl("https://3edc.tistory.com/")
            .build()
            .create(RetrofitService::class.java)
    }
}
반응형