프레임워크/Android

Hilt 간단한 예제

Julie825 2022. 10. 27. 01:50

Hilt의 기본 개념은 아래 링크에 잘 나와있다. 우선 읽어보자

[Hilt tutorial] https://blog.mindorks.com/dagger-hilt-tutorial

 

이걸 잘 읽고, 이제 아래 그림을 머릿속에 담아두며 실습을 해보자


Activity에서 Cake을 필요로 한다. 이때 Cake은 아래와 같은 종속성을 필요로한다.

Cake(bread: Bread)
Bread(flour: WheatFlour, milk: Milk)
WheatFlour(wheat: Wheat)

 

[Step 1] 우선 모듈에서 Provide를 구현하고 그 후에 Inject를 해주자.

/* Module */

import farmer <- 이런 import문은 들어가도 괜찮다 놀라지 말자
import Wheat
import WheatFlour ...

@Module
@InstallIn(SingletonComponent::class) // 생명주기 지정
class FoodModule {
	
	@Singleton
	@Provides
	fun provideWheat(): Wheat = farmer().buy()

	@Singleton
	@Provide
	fun provideWheatFlour(w: Wheat): WheatFlour = WheatFlour(w)
	// 이제 이 Wheat은 위에 선언한 provideWheat으로부터 주입받는다. 
	// 그 증거로 코드 왼쪽에 ⬆ 이런 기호가 생기고, 누르면 주입받는 함수로 이동한다.

	@Singleton
	@Provide
	fun provideMilk(): Milk = Cow().getMilk()
	
	@Singleton
	@Provide
	fun provideBread(flour: WheatFlour, milk, Milk): Bread
		 = Bread(flour, milk)
	// milk는 provideMilk에서, flour는 provideWhaetFlour에서 주입받는다.
}

/* 실제 예시 */
@Provides
@Singleton
fun provideDataBase(@ApplicationContext context: Context): AppDatabase = Room.databaseBuilder(
    context,
    AppDatabase::class.java, "mydata"
).build()

 

[Step 2] 이제 각 클래스 생성자에 @Inject 를 넣어주러 가자.

이제 클래스에서 뭐가 필요할 때, 다 생성자에 때려박고 Hilt한테 받으면 된다. WheatFlour 구현하다가 Farmer를 어떻게 얻지..? 하고 고민할 필요가 없다.

Cake @Inject constructor(bread: Bread){
	// provideBread한테서 받음
}
Bread @Inject constructor(flour: WheatFlour, milk: Milk){
	// provideWheatFlour, provideMilk 작동
}
WheatFlour @Inject constructor(wheat: Wheat){
	// provideWheat 작동
}

[Step 3] 이제 Activity랑 앱 전역 설정해주러가자.

App.kt

@HiltAndroidApp
class App : Application() {
}

BakeryActivity.kt

@AndroidEntryPoint
class BakeryActivity: AppCompatActivity() {
}
// Fragment에서 쓰는거면 걔가 파생되는 activity에도 붙여줘야함.

manifest.xml

<application
  android:allowBackup="true"
  ...
  **android:name=".App" <- App 적용시키기**
>

모듈수준 build.gradle

... 맨 아래 디펜던시 블럭에 추가...
dependencies {
	// Hilt
	implementation "com.google.dagger:hilt-android:2.44"
	kapt "com.google.dagger:hilt-compiler:2.44"
	implementation 'androidx.fragment:fragment-ktx:1.5.3'

이렇게 하면 힐트 적용 완료