[Android/Kotlin][TIL] MVVM 패턴 분석

hyomin·2022년 4월 16일
0

TIL

목록 보기
2/14





class SomeViewModel : ViewModel(){
	
    
    // state holder -> view 상태를 결정하고 , 이것만 봐도 view를 할 수 있음
    val _viewState: LiveData<ViewState>
    val _viewState2 : StateFlow<ViewState>
    
    // event -> 반드시 사용자에게 어떤 일이 일어났음을 알리는 용도
    //(api 성공, error , dialog)
    val _viewEvent : SingleLiveEvent<ViewEvent>
    val _viewEvent : Channel<ViewState> //
    
    
    //trigger
    fun submit():Unit{
    	try{
        	val responseModel = repository.api()
            val viewState = responseModel.toViewState()
            -viewState.value = viewState
          }catch( ... ){
          	_viewEvent.value = ViewEvent.Error(it)
          }
    }

}

ViewModel은 뷰를 추상화하기 위해 추상화된 뷰 상태(ViewState)를 유지한다. 예를 들어 뷰모델은 읽기와 쓰기가 가능한 문자열 속성을 통해 텍스트 입력기 컨트롤을 추상화한다. 데이터 목록을 보여주는 컨트롤에 대해서는 각 요소의 뷰 상태가 들어있는 컬렉션이 사용된다.

API response 값을 그대로 view에 전달하기보다는 한번 가공해서 전달하는 것이 좋다

https://justhackem.wordpress.com/2017/03/05/mvvm-architectural-pattern/#comments

  • ViewState
    ViewState는 화면이 가지는 본질적인 데이터입니다.
    뷰 모델에서 ViewState는 뷰에 의해 입력받기도 하고, ViewState에 따라 뷰를 그려주기도 합니다.
    예를 들어 로그인 화면이 있다고 가정해보겠습니다. 이 화면에서 EditText로 구성된 아이디, 비밀번호가 있습니다.
    여기서 아이디, 비밀번호가 ViewState가 되는 것이고 사용자로부터 입력받아 뷰 모델에 채워지게 됩니다.
  • ValueConverter
    ValueConverter는 본질적인 데이터들을 가지고 만들어 내는 작업입니다.
    다시 로그인 화면을 예로 들어보자면, ViewState인 아이디와 비밀번호가 있겠고 활성화 시킬 수 있는 로그인 버튼이 존재합니다.
    이때 로그인 버튼의 활성화 여부가 ValueConverter에 해당이 됩니다.
    ViewState인 아이디, 비밀번호가 둘다 공백이 아니어야 하는 조합으로 하나의 불리언 값을 가지게 되고 뷰에 반영되게 됩니다.
    코드를 작성할 때 따라서 ViewState로 작성하다가도 ValueConverter으로 표현할 수 있는 형식이 아닌지 고민해봐야 합니다.
    ViewState가 적을수록 가독성이 높아지고 모듈화 하기 쉬워지기 때문입니다.
  • Command
    뷰는 사용자에게 정보를 보여주는 역할이기도 하면서, 사용자로부터 이벤트를 받아들이는 역할도 합니다.
    따라서 뷰모델은 이러한 이벤트에 대한 처리도 해줄 수 있어야 합니다. 그게 바로 Command입니다.
    다시 로그인 화면을 예제로 들자면 로그인 동작이 Command가 될 것입니다.
    Command은 항상 ViewState를 활용해 ViewState를 변경하거나 신호를 내보내는 역할을 합니다.
    따라서 뷰 모델이 노출한 뷰의 행동은 직접적으로 뷰를 참조하지 않아도 됩니다.

참고
https://velog.io/@bang/Android-MVVM-pattern-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0

profile
🌱

0개의 댓글