[Android 개념] ViewModel 에서 Data load는 어떻게 해야할까

이창민·2022년 9월 12일
0

Android 개념

목록 보기
9/9

처음 Android 를 개발하면 Viewmodel 에 언제 Data load를 언제하는 게 맞을 지 생각한 적 없이 사용하다 어느정도 개발하고,, 성능을 향상시키는 고민을 하다보면 언제하는게 맞는지 고민을 하게 된다.

무슨 방법이 맞을까?

Activity or Fragment

Activity나 Fragment에서 viewmodel.loadData() 하는 방법이 있을 것이다.

정말 간단한다.

생각해보면 구현이 정말 쉽고 파라미터도 액티비티나 프래그먼트에서 바로 넘겨주면 된다.
하지만, 구성 변화시 다시 loadData()를 호출을 할 것이고 이렇게 되면 자연스럽게 안드로이드 생명주기 메서드와 코드를 맞춰줘야할 것이다.

ViewModel init

ViewModel의 init에서 load하는 방법이 있다.

class ViewModel (repository: Repository): ViewModel{
	// ...
    
    init {
    	livedata.value = repository.getData()
    }
}

데이터를 처음 한번만 로딩하면 되고 구현하기 굉장히 쉽다.
위와 다르게 매개변수를 전달할 수 없고 생성자에서 데이터를 로딩하는 것은 적합하지 않습니다.

Lazy

코틀린의 lazy를 사용하는 방법이 있다.

class MyViewModel : ViewModel() {
    private val users: MutableLiveData> by lazy {
        MutableLiveData>().also {
            loadUsers()
        }
    }

    fun getUsers(): LiveData {
        return users
    }

    private fun loadUsers() {
        // Do an asynchronous operation to fetch users.
    }
}

데이터를 라이브데이터에 처음 접근할때 로딩하고 구현하기 쉽다.
매개변수를 전달할 수 없다.

생명주기 인식 컴포넌트

안드로이드 공식문서를 참고하면 아래와 같은 코드를 확인할 수 있다.

class MyViewModel: ViewModel() {
    init {
        viewModelScope.launch {
            // Coroutine that will be canceled when the ViewModel is cleared.
        }
    }
}

viewmodel이 onCleared 될 때 코루틴이 취소된다.

그렇다면 가장 중요한건 무엇일까 불필요한 리소스의 낭비를 막아주는 것이 가장 중요하다고 생각된다.

init 안에서 viewModelScope.launch를 하든 어떤 방법이든.. 불필요한 리소스를 잘 해제한다면 그게 정답이 아닐까?..

참고자료

  1. https://proandroiddev.com/when-to-load-data-in-viewmodels-ad9616940da7
  2. https://developer.android.com/topic/libraries/architecture/coroutines
profile
android 를 공부해보아요

0개의 댓글