📱 Android

[Jetpack] LiveData와 ViewModel

콩드로이드 2023. 3. 23. 16:11

Jetpack 라이브러리의 Architecture(안드로이드 앱의 아키텍처를 지원하는 데 필요한 기술들을 제공) 카테고리에 속해있는

ViewModel과 LiveData에 대해 간략히 정리해보겠습니다 :)

 


LiveData

 :  생명주기를 인식하는 observer pattern을 구현하는 데이터 홀더 클래스 

 

데이터 변경 시 UI에 알림을 보내고 Activity, Fragment등 구성요소의 lifecycle에 따라 관찰 가능 

 

🔍 특징 

- UI 업데이트에 사용되는 Data들을 쉽게 관리할 수 있다

- 생명주기를 인식해 Data Update를 알려준다

- 안전하게 관찰가능하도록 설계되어서 NPE 방지가 가능하다

- 구성요소 변경(화면 회전 등)의 이유로 Activity 재생성시 이전 상태 저장 

 

 

 


 

ViewModel

: UI관련 데이터를 저장, 관리하는 클래스

 

 

🔍 특징 

- UI 컨트롤러 (Activity, Fragment) - 데이터 소스 (repository, usecase)를 연결 

 

🔑 Activity가 완전 finished 될 때까지 viewmodel lifecycle 유지 

 

 

⛔️ ViewModel에서 context 사용이 안 좋은 이유 

ViewModel은 activity, fragment 구성변경에 영향 X, 액티비티가 완전히 종료될 때 까지 생명주기를 유지

근데 context는 Activity 생명주기를 따르므로 -> 메모리 누수 발생 가능성..!

 

만약 context를 쓰고 싶다면, Application Context를 써버리자  🙂

 

 


LiveData, viewModel은 아래와 같이 사용하고 있습니다 :) 

 

@HiltViewModel
class BookViewModel @Inject constructor(private val repository: MainRepository) : ViewModel() { 
...

}

 

    var bestSellerData = MutableLiveData<Resource<GetBookResponse>>()

    fun getBestSeller() {
        viewModelScope.launch {
            withTimeout(Constants.TIMEOUT_MILLIS) {
                bestSellerData.postValue(Resource.loading(null))

                try {
                    bestSellerData.postValue(Resource.success(repository.getBestSeller().body()!!))
                } catch (e: Exception) {
                    bestSellerData.postValue(Resource.error(null, e.message ?: COMMON_ERROR))
                }
            }
        }
    }