MVVM 적용하기

Darby·2024년 1월 16일

앱개발 후기

목록 보기
1/4

MVVM(Model-View-ViewModel)

MVVM은 거의 대부분의 Android 개발을 하다 보면 많이 보는 아키텍처이다.
처음에는 MVVM을 접했을 때 이미 AAC의 ViewModel이 나온 후 였고 MVVM의 대해 알아보려 하면 몇몇 블로그에서 AAC의 ViewModel로 MVVM을 구현을 해놓은 블로그 글들이 몇 개 있다. 그래서 MVVM의 ViewModel이랑 같은 건 줄 알았다. 근데 뭔가 이것만으로는 이해하기에 부족했다. 왜냐하면 ViewModel(AAC)은 Android에서 사용하는건데 MVVM은 MS사에서 만든 아키텍처라는 걸 알았기 때문이다. MVVM개념이 훨씬 먼저 나오기도 했다.

그러다가 원티드에서 챌린지를 참여하게 되었는데 어떤 영상을 보게 되었다. 네이버 2018 테크 콘서트 영상입니다. 오래된 영상이지만 MVVM의 기초를 이해하기에는 좋은 영상인 것 같다. 지금은 XML을 이용해서 개발한 앱이 아니지만 왜 DataBinding이 들어가야하는지 Observer패턴만으로는 왜 반쪽짜리 MVVM인지 잘 설명해주는 영상입니다.

근데 최근 Google을 보면 DataBinding은 2019년 3월에 업데이트 된 게 마지막이다.
사용하는데는 문제는 없지만 ,,

Compose는 선언형 UI 프레임워크이다보니 사실 DataBinding을 사용하지 않고 MVVM 아키텍처를 만드는데 지장이 없다고 생각한다.

MS사의 MVVM을 설명해놓은 이미지이다. ViewModel이 하는 역할을 View에서 Event가 발생하면 Model에게 Update요청을 해달라고하면 Model의 업데이트가 끝나면 다시 역순으로 알려주게된다.
해당 View는 데이터를 구독하는 형태로 있다가 데이터가 바뀌면 화면에서 보여주는 데이터가 바뀌게 된다.

개인적으로 중요하다고 생각되는 부분은 ViewModel은 View에 대해 절대 종속되면 안된다는 것이다. ViewModel은 1:N 관계를 가지는데 어떠한 View 종속되면 나중에 수정이나 재활용하기 어려워진다. 그렇게되면 MVVM을 쓰는 이유가 사라진다.

@HiltViewModel
class MainViewModel @Inject constructor(private val userRepository: UserRepository) : ViewModel() {
    private val _userData = MutableLiveData<ResultVO>()
    val userData: LiveData<ResultVO> get() = _userData

    private val _errorLiveData = MutableLiveData<String>()
    val errorLiveData: LiveData<String> get() = _errorLiveData
    fun clearErrorData() {
        _errorLiveData.value = null
    }

	
    fun getUserData(id: String) {
        viewModelScope.launch {
            try {
                val result = userRepository.getUserData(id)
                _userData.value = result
                clearErrorData()
            } catch (e: Exception) {
                _errorLiveData.value = e.message.toString()
            }
        }
    }
}

제 앱에 들어가있는 ViewModel인데 사실 AAC의 ViewModel을 사용하여 MVVM의 ViewModel 기능을 같이하게 만들었다.
아니 위 영상에서는 DataBinding 없는 MVVM은 반쪽짜리 MVVM이라 했는데?
처음에는 저도 그렇게 생각을하다가 Compose를 사용하는데 DataBinding이 필요없다라는 것을 알고 이렇게 구현을 하게 되었다.


MVVM에 대한 나의 생각 3줄 요약
  1. MVVM의 ViewModel과 AAC의 ViewModel은 서로 상관이 없는 개념이다.
  2. MVVM을 알고 싶으면 MS사의 문서를 보는게 낫다.
  3. 그렇다고 AAC의 ViewModel이 MVVM의 ViewModel 기능을 할 수 없다 라는 것은 아니다. 구현하기에 따라서 가능하다. (+ kotlin Flows, LiveData를 같이 사용해서 구현하면 좋다.)

나중에는 MVI도 알아봐야겠다.

profile
성장하는 개발자가 되자

0개의 댓글