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
어노테이션을 사용해요.