
Dagger Hilt는 의존성 주입을 위해 사용하는 Android Jetpack의 라이브러리로 자동으로 수명주기를 관리해요.
결합도를 줄이고 좀 더 유연한 코드를 작성하기 위해 사용하는 Android Jetpack의 라이브러리에요.
Hilt를 사용하는 모든 앱에는 @HiltAndroidApp 어노테이션이 있는 Application 클래스가 존재해야 해요.@HiltAndroidApp 은 컴파일 시 표준 컴포넌트 빌딩에 필요한 클래스들을 초기화해요.@HiltAndroidApp
class BaseApplication: Application() { ... }
Hilt를 사용하기 위해 필요한 클래스들을 초기화하기 위해서는
@HiltAndroidApp어노테이션이 있는 Application 클래스가 필수에요.
Hilt는 @AndroidEntryPoint 어노테이션이 있는 Android 클래스에 의존성을 주입할 수 있어요.@AndroidEntryPoint를 이용하여 Android 클래스에 어노테이션을 달아주었다면, 해당 클래스에 종속된 Android 클래스에도 어노테이션을 추가해주어야해요.@AndroidEntryPoint는 프로젝트의 Android 클래스에 대해 개별적인 Hilt 컴포넌트를 생성해요. 이러한 Hilt 컴포넌트는 상위 클래스로부터 의존성 주입을 받을 수 있어요.Hilt 컴포넌트는 해당 Android 클래스에 바인딩을 주입하는 역할을 해요.Hilt는 SingletonComponent로부터 바로 BroadcastReceiver를 주입하기 때문에 BroadcastReceiver에 대해서는 컴포넌트를 생성하지 않아요.
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var runDAO: RunDAO
...
}
Android 클래스에 의존성을 주입하기 위해서는 해당 클래스마다
@AndroidEntryPoint어노테이션을 달고,@Inject어노테이션으로 객체 주입을 요청해야 해요.
MainViewModel은 mainRepository 의존성으로 지니므로, Hilt는 mainRepository가 인스턴스를 어떻게 제공하는지에 대해 반드시 알고있어야 하는 거예요.class MainViewModel @Inject constructor(
val mainRepository: MainRepository
) { ... }
Hilt는 생성된 컴포넌트 클래스의 인스턴스를 해당 Android 클래스의 생명주기에 따라 자동으로 생성하고 파괴해요.
Hilt의 모든 바인딩은 Scope가 지정되지 않으며, 앱에서 바인딩을 요청할 때마다 Hilt는 필요한 유형의 새로운 인스턴스를 만들어요.
인스턴스 정보를 제공하기 위해서는 constructor injection을 사용하는데요, Hilt는 Android 클래스의 생명주기에 따라 인스턴스를 자동으로 관리해줘요.
@Module 을 만들어 바인딩 정보를 Hilt에 제공할 수 있어요.@InstallIn 어노테이션을 사용하여 어떤 컴포넌트에 모듈을 설치할지 반드시 정해주어야해요.Hilt module에서 제공하는 의존성은 Hilt module을 설치하는 Android 클래스와 연결된 모든 컴포넌트에서 사용할 수 있어요.
Hilt module 내의 @Binds 어노테이션을 이용하여 추상 함수를 만들어 바인딩 객체와 함께 Hilt를 제공할 수 있어요.Hilt에 알려줘요.Hilt가 인터페이스의 인스턴스를 필요로 할 때 어떤 implementation을 제공해야할지 Hilt에 알려줘요.Hilt module 내부에 함수를 만들고 해당 함수를 @Provides 어노테이션으로 처리하여 타입 인스턴스를 제공하는 방법을 Hilt에 알릴 수 있어요.Hilt에 알려줘요.Hilt에 알려줘요.Hilt에 알려줘요. Hilt는 함수의 바디를 실행한다.@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Singleton
@Provides
fun provideRunningDatabase(@ApplicationContext app: Context) =
Room.databaseBuilder(app, RunningDatabase::class.java,
RUNNING_DATABASE_NAME
).build()
@Singleton
@Provides
fun provideRunDao(db: RunningDatabase) = db.getRunDao()
}
constructor injection이 불가능할 때는
@Module을 만들어@InstallIn어노테이션으로 설치할 컴포넌트를 정하고 바인딩 정보를 제공해요.
인터페이스는@Binds어노테이션을, 외부 라이브러리 클래스는@Provides어노테이션을 사용해요.