인프런 커뮤니티 질문&답변

윤성식님의 프로필 이미지
윤성식

작성한 질문수

냉동코더의 알기 쉬운 Modern Android Development 입문

ViewModelProviderFactory에 관련해서...

작성

·

218

0

ViewModelProviderFactory이 잘 이해가 안갑니다!!

Repository와 ViewModel 둘 만 있으면 ViewModel 생성자 부분이 아닌 다른 곳에다가 변수로 Repository를 선언해주면 똑같이 api호출할 수 있는 것 아닌가요!?

굳이 왜 ViewModelProviderFactory가 필요한지 이해가 안갑니다!

답변 2

0

냉동코더님의 프로필 이미지
냉동코더
지식공유자

ViewModel 내부에서 Repository 인스턴스를 만드는 것은 좋은 방법이 아닙니다. 외부에서 인스턴스를 만들어 의존성으로 주입하시는 것이 가장 좋은 방법인데, 의존성 주입에 대해서는 [섹션 10. Dagger-Hilt]를 학습하시면 잘 사용하실 수 있으실거에요 :)

윤성식님의 프로필 이미지
윤성식
질문자

넵!! 자세한 답변 감사드립니다 :)

0

냉동코더님의 프로필 이미지
냉동코더
지식공유자

외부에서 작성한 Repository 인스턴스를 ViewModel에 전달해 주어야 하는데 ViewModelProvider로 ViewModel 인스턴스를 생성할 때는 초기값을 전달할 수가 없습니다. 그래서 ViewModelProvider.Factory를 사용해 초기값으로 전달하는 것입니다.

Practice2C 시점에서는 Repository에 싱글톤으로도 사용할 수 있는 api 밖에 없어서 굳이 초기값으로 전달해야 할 필요성이 안 보일 수도 있으나, 이후 강의에서 여러가지 모듈이 추가되기 때문에 초기값으로 전달해 준 것입니다. 참고하시라고 강의가 완료된 시점의 Repository 코드 링크를 첨부해 드립니다.

https://github.com/cliearl/book-search-app/blob/master/app/src/main/java/com/qualitybitz/booksearchapp/data/repository/BookSearchRepositoryImpl.kt

윤성식님의 프로필 이미지
윤성식
질문자

자세한 답변 감사합니다!!

제가 첫 프로젝트에서 진행할 때에는 밑에 처럼 생성해서 사용하였습니다.

별 다른 문제 없이 api를 호출할 수 있었는데, 밑에 처럼 했을 때 생기는 문제점이 있을까요?

<activity 코드>
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)


<ViewModel 코드>
    private val repository = Repository()

    private val _result = MutableLiveData<List<Plant>>()
    val result : LiveData<List<Plant>>
        get() = _result

    fun getAllData() = viewModelScope.launch {
        Log.d("MainViewModel", repository.getAllData().toString())
        _result.value = repository.getAllData()

    }
윤성식님의 프로필 이미지
윤성식

작성한 질문수

질문하기