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
반응형