📌근본적인 컨셉
View와 비즈니스 로직을 분리시키기 위함
사용자에게 보이는 버튼, 텍스트
화면에 애플리케이션 데이터를 표시하고 사용자와 상호작용 ex)버튼 클릭, 네트워크 처리, 데이터의 변경
Data layer에서 가져온 애플리케이션 상태를 시각적으로 나타냄
room DB, retrofit으로 네트워크 통신이나 로컬 DB 통신을 함
UI elements : Button, editText
events : Button 클릭, TextWatcher, onResume...
UI state : UI 상태값 ex)Livedata, StateFlow, SharedFlow
ViewModel이 Data Layer에 데이터 요청을 보내면 Data Layer는 요청받은 정보를 가지고 ViewModel에 데이터를 전송해주고 ViewModel은 UI elements에 UI state(상태값)을 전달한다.
ViewModel는 비즈니스 로직을 캡슐화하고 UI 상태를 나타냄
1.UI Layer에 이벤트를 알리거나
ex)Toast를 띄우거나, 다이얼로그 노출, 다른 액티비티로 이동 시키기
2.상태를 업데이트 함
ex)뷰의 상태. Text 숨기거나, 버튼 노출
UI elements와 UI Layer는 다른 것
UI elements : 버튼 텍스트
UI Layer : 사용자에게 보여지는 하나의 계층
ViewModel은 View의 라이프사이클이 종료(destroy)될 때 사라짐(cleared)
Activity가 죽었을 때 ViewModel에서 Text를 세팅하라고 하면 앱이 죽어버림
구글에서 Activity와 ViewModel의 lifeCycle을 결합시켜 Activity가 destroy될 때 cleared되게 만들어놓음
Viewmodel에서 요청한 데이터를 처리, 반환
Local DB(SQLite, Room), Network 통신(Retrofit)을 이용
Activity에서 ViewModel에 요청하면 ViewModel은 Repository를 통해 Model을 통해 데이터 통신을 하고 retrofit을 통해 API 통신을 하는 게 일반적
LiveData를 통해 Activity에게 알려주는 게 목적
Activity에서 모든 걸 다 함.
View도 Controller하고 Model도 Controller 함
ex) SignUpViewModel
private val viewModel by lazy {
ViewModelProvider(this@SignUpActivity).get(SignUpViewModel::class.java)
//ViewModelProvider(this@SignUpActivity)[SignUpViewModel::class.java] //같음
}
class SignUpViewModel: ViewModel() {
private val _test: MutableLiveData<String> = MutableLiveData()
val test: LiveData<String> get() = _test
}
Activity에서 버튼을 클릭하면 viewModel에 있는 test함수를 부른다.
Ovserving :ViewModel에 선언해놓은 Livedata가 바뀌는 것을 감시하는 것
MutableLiveData를 바꿀 함수도 선언
버튼을 눌렀을 때 viewModel의 MutableLiveData를 바꿀 함수 호출
Activity에서 비즈니스 로직이라고 생각하는 것들을 다 ViewModel로 옮기면 됨
ViewModel에서 비즈니스 로직 처리한 내용들을 View로 Observing을 해줌
Activity는 ViewModel이 준 데이터를 수동적으로 받는다.
Activity는 ViewModel에게 ~해줘라고 요청한다.
Activity마다 ViewModel이 하나씩 있는 게 Best Case이긴 한데
상황에 따라 2개 이상이 될 수도 있다.
ex)유저 정보를 가지고 있는 ViewModel은 여러 Activity에서 공통으로 쓰일 수도 있다.