Hilt 기본 사용법 정리하기

pass·2024년 4월 14일
0

Android

목록 보기
36/41

⚡️ 이전 프로젝트에서 koin 을 사용하여 의존성 주입을 적용하다 런타임 퍼포먼스가 떨어질 수 있다는 단점이 있어 hilt로 이전하기로 결심하였다.
hilt를 사용하면서 기본적으로 설정하는 방법과 간단한 어노테이션들을 정리하고자 한다.



⚙️ 프로젝트 설정

프로젝트 수준 gradle

id("com.google.dagger.hilt.android") version "2.51.1" apply false

앱 수준 gradle

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")
}



📍 Annotation

@HiltAndroidApp

@HiltAndroidApp
class DiaryApplication : Application()

Hilt 가 Application 의 생명주기를 참고하는 시작점이다.
Android 에서 Hilt 를 사용하기 위해서는 @HiltAndroidApp 어노테이션이 추가된 Application 을 정의해야 한다.

@AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity()

어노테이션이 추가된 Android class 에 대한 컴포넌트를 추가한다

@HiltViewModel

@HiltViewModel
class CalendarViewModel (): ViewModel

ViewModel 생성 시 ViewModelProvider 를 사용하게 되면 보일러 플레이트 코드가 발생하게 되는데, 이를 해결하기 위해 hilt 에서 내부적으로 멀티 바인딩을 활용하여 ViewModel 에 대한 의존성 주입을 할 수 있도록 도와준다. 자세한 내용은 생략...

@Inject

class DiaryRepositoryImpl @Inject constructor(private val db: DiaryDataBase) : DiaryRepository {

    @Inject
    lateinit var service: SummaryService
}

Inject 어노테이션이 사용법은 두 가지로 나뉜다.
첫 번째 방법은 생성자에 @Inject constuctor 를 붙여 생성자 바인딩을 수행한다. 이 방법을 사용하면 파라미터로 있는 변수에 대한 의존성 주입을 받을 수 있고, 현재 클래스의 생성자에서 의존성을 생성한다.
두 번째 방법은 변수에 @Inject 를 붙여 해당 변수에 대한 의존성을 주입받을 수 있도록 한다.

@Module, @InstallIn, @Provides

@Module
@InstallIn(SingletonComponent::class)
class DataBaseModule {

    @Provides
    fun providesDiaryDataBase(context: Context): DiaryDataBase {
        return DiaryDataBase.getInstance(context)
    }
}

@Module 은 의존성을 주입하기 위한 Module 을 생성할 때 필요한 어노테이션이다.
@InstallIn 을 항상 같이 사용해주어야 하며, @InstallIn 은 어떤 컴포넌트에 생성할 지 정의한다.

@Binds

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 에 대한 의존성으로 변환한다.



🌈 hiltViewModel

@Composable
fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) { }

hilt 를 사용할 경우, view 에서 ViewModel 을 주입받는 기본적인 방법으로 viewModel() 을 사용할 수 있다.
hiltViewModel() 은 navigation 사용 시 기존에 백스택을 추적하여 기존에 생성된 viewModel 을 정리해주는 기능이 추가되어 있다고 한다.
마이그레이션하는 프로젝트에서는 navigation 을 사용하여 hiltViewModel 을 추가하였다.



🔥 마무리

지금까지 기존 프로젝트에서 koin -> hilt 로 마이그레이션 하는 과정에서 사용하였던 hilt 개념들을 살펴보았다. 기본적인 어노테이션과 기능들만 다루었고, 컴포넌트 개념, 멀티 바인딩 등 추가적인 부분들은 다음에 정리해보아야겠다.

profile
안드로이드 개발자 지망생

0개의 댓글