Hilt는 Google에서 제공하는 DI 라이브러리 Dagger를 기반으로 만들어짐
Dagger2에 비해서 좀 더 이해하기 쉽고 사용하기가 쉬움
그리고 구글에서 적극적으로 지원하고 있어서 Compose에도 맞고 내 생각에도 아직은 알파 베타만 나오지만 지원을 하고 있으니 꼭 파고들어야 할듯
Application class
: Hilt를 사용하는 모든 앱은 @HiltAndroidApp
어노테이션을 Application Class
에 반드시 추가해야 하며 의존성 주입의 시작점을 지정 함
Hilt는 Application
생명 주기를 따르며 컴파일 단계 시 DI
에 필요한 구성요소들을 초기화 하기 위함
@HiltAndroidApp
class GeunTaeHobbyApplication : Application()
<application
android:name=".GeunTaeHobbyApplication"
...
</application>
AndroidEntryPoint :
종속 주입이 필요한 Activity에는 @AndroidEntryPoint
주석으로 선언하여
Hilt 주입에 필요한 구성요소를 생성함 주입의 시작점을 알림
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
...
}
@Inject
어노테이션을 사용하여 의존성을 생성하는 방법이며constructor()
에 @Inject
어노테이션으로 의존성 인스턴스를 생성하고, 생성자의 파라미터로 의존성을 주입받을 수도 있으며 생성 시 어떤 클래스 객체가 필요한지 Hilt도 개발자도 알 수가 있음class HomeAssetDataSource @Inject constructor(
private val assetLoader: AssetLoader
) : HomeDataSource {
...
}
}
// 해당 클래스에 생성하지 않아도 객체를 주입 받아 사용이 가능 한 것
@Inject lateinit var homeAssetDataSource: HomeAssetDataSource
// 파라미터에 주입해서 쓰는 것
@Inject
fun directToDatabase(databaseService: DatabaseService) {
atabaseService.log("Method Injection")
}
Provide
와는 다르게 interface
타입의 객체에 Hilt에게 알려주기 위한 용도 이며 외부라이브러리에는 사용이 불가하며 추상적으로 사용//interface 타입의 객체를 어떻게 만드는지 Hilt에게 알려주기 위한 용도
@Binds
abstract fun bindCartItemDataSource(
dataSource: CartItemLocalDataSource
): CartItemDataSource
@Module
과 @InstallIn
선언은 아래와 같은 형태로 선언되며 @InstallIn
안에 들어가는 Hilt 컴포넌트들과 자세한 내용은 아래에서 설명을 이어가겠습니다.
@Module
을 하고 추가로 @InstallIn(component)
어노테이션을 지정하여 어떤 컴포넌트에 install 할지를 반드시 정해야 함그리고 @InstallIn(component)
는 생명주기를 내부적으로 자동으로 관리해주기 때문에 환경을 제공해줌
밑에는 공식에서 가져온 것
해당 주기에 맞게 설정을 하면 됨
Scope
내에서 사용 할 수 있도록 하는 것그리고
Room DB
, Retrofit
, Gson
, Application
, Context
등이 가능@InstallIn(SingletonComponent::class)
@Module
object AssetModule {
@Provides
@Singleton
fun providesAssetLoader(@ApplicationContext appContext: Context): AssetLoader =
AssetLoader(appContext)
@Provides
@Singleton
fun provideTodoAssetDataSource(assetLoader: AssetLoader): HomeAssetDataSource {
return HomeAssetDataSource(assetLoader)
}
@Provides
@Singleton
fun provideTodoAssetRepository(assetDataSource: HomeAssetDataSource): HomeRepository {
return HomeRepository(assetDataSource)
}
}
@Named("Identifier")
Annotation을 썻던 거랑 비슷 한거 같은 타입에 객체를 구별하게 해주는 것@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class CallInterceptor
@ResponseInterceptor
@Provides
fun provideResponseNetworkService(): NetworkService {
return NetworkService.Builder()
.host("google.com")
.protocol("HTTPS")
.interceptor(ResponseInterceptorImpl())
.build()
}
@CallInterceptor
@ResponseInterceptor
@Inject lateinit var networkService: NetworkService
@HiltViewModel
어노테이션과 @Inject
어노테이션을 사용하면 간단하게 ViewModel
의존성 주입을 활성화 할 수 있음@HiltViewModel
에 의존성을 주입하면 기존에 쓰는 ViewModel
에 팩토리 패턴을 만들어 준 것을 삭제 해도 됨 지원을 해주기 때문에그리고
옛날 버전에는 @HiltViewModel
아니라 Inject
을 넣어서 사용 했음 버전이 올라가면서 삭제됨
@HiltViewModel
class CartViewModel @Inject constructor(
private val cartRepository: CartRepository
) : ViewModel() {
...
}
참고
https://0391kjy.tistory.com/55
https://developer88.tistory.com/349
https://salmonpack.tistory.com/41?category=1118477
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko