안드로이드 힐트(Hilt)로 뷰모델 주입하기
회사에서 신규 프로젝트를 하면서 MVVM 패턴을 사용하고 있다.
MVVM 패턴을 사용할 때 거의 필수인 Hilt를 사용하여 프로젝트를 진행했다.
오늘은 가장 흔히 사용되는 뷰모델(ViewModel)을 주입하는 방법을 소개한다.
먼저, 힐트를 위한 기본 세팅을 해야하는데 이전 글을 참고하길 바란다.
1. ktx dependency 추가하기
dependencies {
//ktx
implementation "androidx.activity:activity-ktx:1.5.0"
implementation "androidx.fragment:fragment-ktx:1.5.0"
}
앱 수준의 gradle 파일에 activity-ktx, fragment-ktx를 추가해준다.
뷰모델 주입을 간편하게 해준다.
2. @AndroidEntryPoint 주석 달기
@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>(){}
뷰모델을 주입할 액티비티나 프래그먼트에 @AndroidEntryPoint 주석을 단다.
이 컴포넌트에 힐트를 이용하여 객체를 주입할 것이다 라는 신호이다.
3. Hilt에 뷰모델을 주입하는 방법 알려주기
@HiltViewModel
class MainViewModel @Inject constructor(
application: Application,
val preferenceRepository: PreferenceRepository
) : BaseViewModel(application) {
Hilt가 객체를 주입하려면 그 객체를 어떻게 생성해야하는지 알아야한다.
Hilt는 이것을 생성자 주입을 통해 객체의 생성 방식을 알게된다.
일단, 우리는 뷰모델을 주입할 것이기 때문에 ViewModel 클래스 위에 @HiltViewModel 어노테이션을 달아준다.
그리고 constructor 앞에 @Inject 어노테이션을 적어주면서 힐트에게 이 객체를 만들 때 필요한 객체를 주입한다.
(동시에 힐트에 뷰모델을 만들 때 이러한 객체들이 필요하다는 것을 알려주게 된다.)
가끔, 다른 블로그보면 @ViewModelInject 어노테이션을 쓰는 경우가 보이는데 이것은 이제 deprecated 되었다!
👉참고로 Hilt에서는 기본적으로 제공하는 객체들이 있다.
위의 코드에서는 application이 그 예이다.
따로 어노테이션을 달아주지 않아도 Hilt는 application 객체를 알아서 주입해준다.
이와 같은 객체에는 ActivityContext가 있다.
4. 액티비티에 뷰모델 변수 선언하기
@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>(){
private val mainViewModel: MainViewModel by viewModels()
}
이번에는 프래그먼트에서 액티비티 뷰모델을 참조하는 방식을 알아보자.
너무 간단하다. 쫄지말자 ㅋ
@AndroidEntryPoint
class MeasureFragment : BaseFragment<FragmentMeasureBinding>(), OnMapReadyCallback {
override val layoutResID: Int
get() = R.layout.fragment_measure
@Inject
lateinit var preferenceRepository: PreferenceRepository
private val measureViewModel: MeasureViewModel by viewModels()
private val mainViewModel: MainViewModel by activityViewModels() }
우선, Fragment 클래스 위에 @AndroidEntryPoint를 적어준다.
그리고 액티비티에서 주입한 뷰모델을 선언해준다.
이때는 by viewModels()가 아니라 by activityViewModels()를 통해 뷰모델을 선언해주면 된다.
이제 액티비티에서 사용하는(액티비티 컴포넌트에서 선언된) 뷰모델을 공유해서 사용할 수 있다.
이렇게하면 데이터를 액티비티와 프래그먼트가 손쉽게 공유해서 앱을 만들 수 있다.