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))
}
}
}
}
'📱 Android' 카테고리의 다른 글
[Jetpack] Navigation Component #2 args 전달하기 (0) | 2023.05.01 |
---|---|
[Jetpack] Navigation Component #1 기본 뼈대 만들기 (0) | 2023.04.30 |
[Hilt] Hilt 익히기 #2 - Dagger 복습하기 (주요 Annotation) (0) | 2023.01.30 |
[Android] Clean Architecture (0) | 2023.01.08 |
[Android] SOLID 원칙 (0) | 2023.01.08 |