Hilt 를 이용한 DI에서,
구현체를 만들 때 3가지 어노테이션을 사용할 수 있다.
간단히 플로우차트로 나타내면 아래와 같다.
가장 간단한 케이스로, constructor 가 존재하여
1. 모듈이 필요없는 의존성 주입
@Inject constructor(param….)
class DateFormatter @Inject constructor() {
@SuppressLint("SimpleDateFormat")
private val formatter = SimpleDateFormat("d MMM yyyy HH:mm:ss")
fun formatDate(timestamp: Long): String {
return formatter.format(Date(timestamp))
}
}
위 코드는 구글의 Hilt codelab Solution에서 가져왔다.
2. 모듈이 필요한 의존성 주입 (constructor 없음)
Constructor가 없는 이유에 따라 해결법이 갈린다.
a. 외부라이브러리임, 빌더패턴임
b. Interface 임
@Module, @InstallIn(...) 의 어노테이션이 있는
모듈 클래스 내부에 @Provides, @Binds 어노테이션이 붙은 함수를 이용한다.
주의 - 둘은 섞어서 쓸 수 없음...
2-a. @Provides 어노테이션
외부라이브러리나 빌더패턴의 경우에 사용
코드랩 솔루션 일부 (ApplicationComponent 는 현재 Deprecated -> Delete 되었으나 이 글은 @Provides 를 설명하는 글이지 scope를 설명하는 글이 아니고, 코드랩에는 아직 이게 나와있어서 그냥 복붙,,, 이제 쓸일없는 코드)
@InstallIn(ApplicationComponent::class)
@Module
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase {
return Room.databaseBuilder(
appContext,
AppDatabase::class.java,
"logging.db"
).build()
}
//...
}
2-b. @Binds 어노테이션
인터페이스를 주입할 때 필요한 정보를 제공하는 역할.
추상함수 형태로 제공 (따라서 이것을 포함하는 Module class역시 추상 class 가 된다.) -> Binds 와 Provides 를 섞어쓸 수 없는 이유
역할 : 인터페이스클래스와 구현체 클래스를 알려줌
- 리턴타입 : 어떤 인터페이스 인스턴스를 제공하는지 알려줌
- 파라미터 타입 : 인터페이스를 상속하는 녀석들중에 어떤 구현체를 제공할지 Hilt 에 알려줌
@InstallIn(ActivityComponent::class)
@Module
abstract class LoggingInMemoryModule{
@ActivityScoped
@Binds
abstract fun bindInMemoryLogger(impl: LoggerInMemoryDataSource) : LoggerDataSource
}
아마도 함수가 사용안됨으로 표시될건데
@Inject 하면 그렇게 표시되더라도 Inject 하는 곳으로 안내됨..(?) 즉, 신경쓸필요없음
위의 세 방식으로 힐트에게 의존성 주입 방법에 대해 알려주었다.
Binds 나 Provides 는 같은 인터페이스/클래스에 대해 각기 다른 구현을 여러개 가질 수 있다.
이렇게 여러 구현이 있는 경우 @Qualifier 로 어떤 구현을 사용할지 구분할 수 있다.
나도 힐트 초보자이고, 사용법 가이드라기보다는 개념을 이해하기위해 쓴 글이기때문에 엄밀하지 않은 부분이 있을 수 있다.
틀린부분을 댓글로 달아주시면 감사감사...
출처 :
구글 공식 문서
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
Hilt를 사용한 종속 항목 삽입 | Android 개발자 | Android Developers
Hilt를 사용한 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Hilt는 프로젝트에서 종속 항목 수동 삽입을 실행하는 상용구를 줄이는 Android용
developer.android.com
구글 코드랩
https://developer.android.com/codelabs/android-hilt?hl=ko#0
Android 앱에서 Hilt 사용 | Android 개발자 | Android Developers
이 Codelab에서는 Hilt를 사용하여 종속 항목 삽입을 실행하는 Android 앱을 빌드해 보겠습니다.
developer.android.com