android 의존성 주입

Assist·2023년 6월 7일
0

Android

목록 보기
19/21

오늘은 저번에 예고했듯이 Android 의존성 주입 관련에 대해 공부를 해볼려고 합니다!

의존성 주입이란 무엇인가?

유지 보수성을 좋게 하는 방법중 하나가 의존성 주입입니다.

예를들어 제가 이전에 Naver 검색 api관련 프로젝트를 진행하는 와중에

        val factory = SearchViewModelFactory(RepositoryImpl())
        _viewModel = ViewModelProvider(this , factory)[SearchViewModel :: class.java]

이 코드를 기억 하신가요?

보면 viewModel에 factory라는 의존성을 주입한것입니다.

factory 안에는 reposiotryImpl을 넣어서 viewModel 에서 repository을 자유롭게 이용할수 있지요

근데 이 코드에는 문제점이 있습니다.

  • 각 Fragment , activity 마다 factory 을 요구한다면?
    이는 여러개의 factory을 만드는 결과를 만드며 수많은 factory class을 만드는 결과를 초래합니다.

그럼 나중에 코드를 변경을 해야할때 일일이 factory class을 돌아다니게하여 코드의 유지보수를 안좋게 할수도 있지요

그럼 해결법은 뭔데?

Android Hilt을 사용하자

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을 만들 필요가 없어지는군요!

종류에 대해서는

  • @HiltAndroidApp
    Application
  • @HiltViewModel
    ViewModel -> 저희가 썼던것
  • @AndroidEntryPoint
    activity , faragment , view , Service , BroadCastReceiver 등의 있네요

사용법 및 정리글은
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko

음 확실히 개발 속도를 높여주는 역활을 하는것 같습니다 .

그럼 알아봤으니 다음시간엔 직접 Naver Project에 적용해보겠습니다.

읽어주셔서 감사합니다

-피드백와 비판은 언제나 환영입니다 -

profile
안드로이드만 좋아하는 특이한 개발자

0개의 댓글