Mobile/Android(Kotlin)

[Android] Hilt @Binds와 @Provides 차이점. (abstract and object)

개발왕 금골드 2023. 10. 14. 18:14
반응형
  • @Binds
  • @Provides
  • @Binds를 사용할 때 abstract으로 선언하는 이유 예상
  • @Provides를 사용할 때 object로 선언하는 이유 예상

 

@Binds

constructor를 가질 수 없는 interface의 인스턴스를 제공해야 할 때 사용할 구현을 Hilt에 알려준다.

  • 함수 반환 유형은 함수가 어떤 인터페이스의 인스턴스를 제공하는지 Hilt에 알려준다.
  • 함수 매개변수는 제공할 구현을 Hilt에 알려준다.
  • @Binds를 사용하기 위해서는 module을 abstract class로 bind 함수를 abstract function으로 만들어야 한다는 것에 주의하자.
  • 또한, @Provides와 비교하여 @Binds로 생성된 Hilt 자동 생성 클래스 개수가 더 적다.
  • 구현체에 반드시 @Inject constructor()를 명시해야 한다. 그렇지 않으면 오류가 발생한다
interface AnalyticsService {
  fun analyticsMethods()
}

// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
  ...
) : AnalyticsService { ... }

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {

  @Binds
  abstract fun bindAnalyticsService(
    analyticsServiceImpl: AnalyticsServiceImpl
  ): AnalyticsService
}

 

@Provides

클래스가 외부 라이브러리에서 제공되므로 클래스를 소유하지 않은 경우(예 : Retrofit, OkHttpClient, Room 등) 또는 Builder 패턴으로 인스턴스를 생성해야 하는 경우 사용한다.

  • 함수 반환 유형은 함수가 어떤 유형의 인스턴스를 제공하는지 Hilt에 알려준다.
  • 함수 매개변수는 해당 유형의 종속 항목을 Hilt에 알려준다.
  • 함수 본문은 해당 유형의 인스턴스를 제공하는 방법을 Hilt에 알려준다. Hilt는 해당 유형의 인스턴스를 제공해야 할 때마다 함수 본문을 실행한다.
@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {

  @Provides
  fun provideAnalyticsService(
    // Potential dependencies of this type
  ): AnalyticsService {
      return Retrofit.Builder()
               .baseUrl("https://example.com")
               .build()
               .create(AnalyticsService::class.java)
  }
}

 

@Binds를 사용할 때 abstract으로 선언하는 이유 예상

@Provides는 필요한 종속성, 리턴 값, 구현 방법이 모두 함수로 작성된다. @Binds는 인터페이스를 인스턴스화 하기 위해 사용하면서 리턴 값과 구현체에 대한 정보를 전달할 뿐 어떤 종속성이 필요한 지 혹은 구현 방법이 어떠한 지에 대해서는 정보가 필요하기 때문에 abstract로 선언한 후 Hilt가 이를 처리한다고 생각된다.

 

@Provides를 사용할 때 object으로 선언하는 이유 예상

@Provides는 종속성을 외부에서 주입해준다. 해당 파일이 존재해야 이 파일을 Hilt가 찾고 외부에서 주입이 가능한데, object 키워드를 선언하면 싱글톤으로 선언할 뿐 아니라 빌드될 때 해당 object가 메모리에 올라가기 때문에 Hilt가 생성된 object를 찾아서 파일을 자동으로 만들어주고 런타임에 주입을 할 수 있게 된다고 생각된다.

 

 


참고자료 : 

https://developer.android.com/training/dependency-injection/hilt-android?hl=ko#inject-interfaces 

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt를 사용한 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Hilt는 프로젝트에서 종속 항목 수동 삽입을 실행하는 상용구를 줄이는 Android용

developer.android.com

https://yuar.tistory.com/84

 

Hilt 사용법 및 Module (Binds vs Provides) 정리 및 후기

Hilt를 적용하면서 실 사용법과 Module 주입시 Binds 와 Provides 방법중 어떤것을 사용해야할지에 대해 정리하였습니다. 1. Hilt 사용법 build.gradle implementation("com.google.dagger:hilt-android:${Versions.daggerHiltAndro

yuar.tistory.com

 

반응형