객체 간의 의존성을 자동으로 관리하고 주입해주는 도구
new로 객체를 직접 생성하는 대신, DI 라이브러리가 알아서 의존성을 제공해줌
=> like "자동 배달 서비스"
| 라이브러리 | 특징 |
|---|---|
| Hilt | Android 공식 지원, Dagger 기반, 가장 간편 |
| Dagger | 구글이 만듦, 강력, 컴파일 타임 주입 |
| Koin | Kotlin 친화적, 코드 간결, 런타임 주입 |
libs.versions.toml 코드 추가
[versions]
hilt = "2.44" # Hilt 버전 추가
[libraries]
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
[plugins]
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } # Hilt 플러그인 등록
build.gradle (project)에 플러그인 추가
plugins {
alias(libs.plugins.hilt) apply false // Hilt 플러그인 추가
}
build.gradle (module)에 종속성 추가
plugins {
alias(libs.plugins.hilt) // Hilt 플러그인 활성화
id("kotlin-kapt") // Hilt 컴파일러를 사용하기 위해 추가
}
dependencies {
implementation(libs.hilt.android)
kapt(libs.hilt.compiler) // Hilt 컴파일러 추가
}
Application 클래스에 @HiltAndroidApp 추가
@HiltAndroidApp
class MyApplication : Application()
💠 @Inject로 생성자 주입
class Engine @Inject constructor() {
fun start() = "Engine Started!"
}
Hilt가 engine 객체를 자동으로 관리 및 주입
💠 @HiltViewModel로 ViewModel에 주입
@HiltViewModel
class CarViewModel @Inject constructor(private val engine: Engine) : ViewModel() {
fun drive() = engine.start()
}
ViewModel에서 @Inject로 의존성 주입 가능
@HiltViewModel을 사용해야 Hilt에서 관리 가능
💠 @AndroidEntryPoint로 Activity, Fragment에 주입
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: CarViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
println(viewModel.drive()) // "Engine Started!"
}
}
@Inject를 붙일 수 없는 클래스(like 인터페이스, 외부 라이브러리)에 주입하기 위해서는 Hilt Module 사용
💠 @Module + @InstallIn으로 Hilt 모듈 생성
@Module
@InstallIn(SingletonComponent::class) // 앱 전체에서 사용 가능
object AppModule {
@Provides
fun provideEngine(): Engine {
return Engine()
}
}
@Provides를 사용해서 수동으로 객체 제공
💠 @Singleton으로 싱글톤 객체 만들기
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideEngine(): Engine {
return Engine()
}
}
모든 곳에서 같은 Engine 인스턴스를 사용하기 위해서 사용!