⚡️ 이전 프로젝트에서 koin 을 사용하여 의존성 주입을 적용하다 런타임 퍼포먼스가 떨어질 수 있다는 단점이 있어 hilt로 이전하기로 결심하였다.
hilt를 사용하면서 기본적으로 설정하는 방법과 간단한 어노테이션들을 정리하고자 한다.
id("com.google.dagger.hilt.android") version "2.51.1" apply false
plugins {
...
id("kotlin-kapt")
id("com.google.dagger.hilt.android")
}
android {
// ...
kapt {
correctErrorTypes = true
}
}
dependencies {
// ...
implementation("com.google.dagger:hilt-android:2.51.1")
kapt("com.google.dagger:hilt-compiler:2.51.1")
// hiltViewModel 사용하기 위해 필요
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
}
@HiltAndroidApp
class DiaryApplication : Application()
Hilt 가 Application 의 생명주기를 참고하는 시작점이다.
Android 에서 Hilt 를 사용하기 위해서는 @HiltAndroidApp 어노테이션이 추가된 Application 을 정의해야 한다.
@AndroidEntryPoint
class MainActivity : ComponentActivity()
어노테이션이 추가된 Android class 에 대한 컴포넌트를 추가한다
@HiltViewModel
class CalendarViewModel (): ViewModel
ViewModel 생성 시 ViewModelProvider 를 사용하게 되면 보일러 플레이트 코드가 발생하게 되는데, 이를 해결하기 위해 hilt 에서 내부적으로 멀티 바인딩을 활용하여 ViewModel 에 대한 의존성 주입을 할 수 있도록 도와준다. 자세한 내용은 생략...
class DiaryRepositoryImpl @Inject constructor(private val db: DiaryDataBase) : DiaryRepository {
@Inject
lateinit var service: SummaryService
}
Inject 어노테이션이 사용법은 두 가지로 나뉜다.
첫 번째 방법은 생성자에 @Inject constuctor 를 붙여 생성자 바인딩을 수행한다. 이 방법을 사용하면 파라미터로 있는 변수에 대한 의존성 주입을 받을 수 있고, 현재 클래스의 생성자에서 의존성을 생성한다.
두 번째 방법은 변수에 @Inject 를 붙여 해당 변수에 대한 의존성을 주입받을 수 있도록 한다.
@Module
@InstallIn(SingletonComponent::class)
class DataBaseModule {
@Provides
fun providesDiaryDataBase(context: Context): DiaryDataBase {
return DiaryDataBase.getInstance(context)
}
}
@Module 은 의존성을 주입하기 위한 Module 을 생성할 때 필요한 어노테이션이다.
@InstallIn 을 항상 같이 사용해주어야 하며, @InstallIn 은 어떤 컴포넌트에 생성할 지 정의한다.
interface DiaryRepository { }
class DiaryRepositoryImpl @Inject constructor(private val db: DiaryDataBase) : DiaryRepository { }
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
abstract fun bindsDiaryRepository(repository: DiaryRepositoryImpl): DiaryRepository
}
기존에 있는 의존성에 대해 형변환하여 의존성을 바인딩한다.
위 예제코드에서는 DiaryRepositoryImpl 에 대한 의존성을 찾아 DiaryRepository 에 대한 의존성으로 변환한다.
@Composable
fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) { }
hilt 를 사용할 경우, view 에서 ViewModel 을 주입받는 기본적인 방법으로 viewModel() 을 사용할 수 있다.
hiltViewModel() 은 navigation 사용 시 기존에 백스택을 추적하여 기존에 생성된 viewModel 을 정리해주는 기능이 추가되어 있다고 한다.
마이그레이션하는 프로젝트에서는 navigation 을 사용하여 hiltViewModel 을 추가하였다.
지금까지 기존 프로젝트에서 koin -> hilt 로 마이그레이션 하는 과정에서 사용하였던 hilt 개념들을 살펴보았다. 기본적인 어노테이션과 기능들만 다루었고, 컴포넌트 개념, 멀티 바인딩 등 추가적인 부분들은 다음에 정리해보아야겠다.