예제로 올리신 코드가 설명을 하기에 적절하지 않아 보입니다. LiveData 만 변경할 거면 굳이 LiveData를 사용할 이유가 없어 보입니다. 예제를 조금 변경하여 사용자 이름을 변경하는 걸 가지고 설명을 하겠습니다.
class UserViewModel(
private val userRepository: UserRepository
) : ViewModel() {
private _viewState = MutableLiveData<UserViewState>()
val viewState: LiveData<UserViewState> get() = _userNameState
fun onUserNameChanged(userName: String) {
viewModelScope.launch {
val isSuccess = userRepository.updateUserName(userName)
if (!isSuccess) {
return@launch _viewState.postValue(UserViewState.Error("에러메세지"))
}
_viewState.postValue(UserViewState.Success(userName))
}
}
}
sealed class UserViewState {
data class Success(val userName: String): UserViewState()
data class Error(val String): UserViewState()
}
사용자 이름을 업데이트 할 수 있는 onUserNameChanged 함수를 뷰쪽에 공개하고 뷰에서 저장 버튼을 누르거나 하는 액션이 있을 때, 해당 함수를 호출한다고 생각하시면 됩니다. ViewModel에서는 UserRepository라는 서버에 사용자 이름을 업데이트하는 기능을 하는 Repository인스턴스의 함수를 호출하고 결과값에 따라 에러나 성공을 뷰쪽으로 보내는 간단한 코드입니다.
뷰는 viewState를 observe하고 있으면 자동으로 결과값을 통보받겠죠. 항상 이런식으로 뷰쪽에서 액션을 발생시키고 처리한 결과를 뷰쪽에 상태를 보관하는 데이터클래스 등을 통해 알려주는 패턴을 사용합니다.