오늘은 저번에 예고했듯이 Android 의존성 주입 관련에 대해 공부를 해볼려고 합니다!
유지 보수성을 좋게 하는 방법중 하나가 의존성 주입입니다.
예를들어 제가 이전에 Naver 검색 api관련 프로젝트를 진행하는 와중에
val factory = SearchViewModelFactory(RepositoryImpl())
_viewModel = ViewModelProvider(this , factory)[SearchViewModel :: class.java]
이 코드를 기억 하신가요?
보면 viewModel에 factory라는 의존성을 주입한것입니다.
factory 안에는 reposiotryImpl을 넣어서 viewModel 에서 repository을 자유롭게 이용할수 있지요
근데 이 코드에는 문제점이 있습니다.
그럼 나중에 코드를 변경을 해야할때 일일이 factory class을 돌아다니게하여 코드의 유지보수를 안좋게 할수도 있지요
그럼 해결법은 뭔데?
Android Hilt 란 구글에서 발표한 의존성 주입 라이브러리 입니다.
MainApplication , viewModel , activity etc등 여러가지의 의존성 주입 라이브러리가 있습니다.
이를 저희쪽에 가져가서 보면 viewModel 에 factory로 의존성 주입이 아닌
Hilt으로 의존성을 주입한다면?
@HiltViewModel -> 요거 그리고 밑에 Inject 요거
class SearchViewModel @Inject constructor( private val repository : RepositoryImpl) : ViewModel() {
private var _bookSearchLiveData = repository.getBookLiveData()
val bookSearchLiveData get() = _bookSearchLiveData
private var TAG = "SearchViewModel"
// private val test = LiveData<>()
/**
* 책 검색 api
*/
fun requestBookApi(id: String, pw: String, query: String) =viewModelScope.launch(Dispatchers.IO) {
_bookSearchLiveData.postValue(Resource.loading())
repository.requestBookApi(id, pw, query)
// _bookSearchLiveData.postValue(repository.getBookLiveData().value)
// _bookSearchLiveData.value = repository.getBookLiveData().value
}
fun requestSaveSearchList(query :String) = viewModelScope.launch(Dispatchers.IO) {
val time = CompanionFunction.getCurrentDateTime()
val data = SearchList(time , query)
repository.requestSaveSearchList(data)
}
override fun onCleared() {
super.onCleared()
Log.d(TAG , "The SearchViewModel is Clear")
}
}
을 하면 무슨 결과가 나타나느냐?
Android에서 스스로 Factory을 만들어 줬네요?
그럼 저희는 Factory을 만들 필요가 없어지는군요!
종류에 대해서는
사용법 및 정리글은
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
음 확실히 개발 속도를 높여주는 역활을 하는것 같습니다 .
그럼 알아봤으니 다음시간엔 직접 Naver Project에 적용해보겠습니다.
읽어주셔서 감사합니다
-피드백와 비판은 언제나 환영입니다 -