본문 바로가기

안드로이드/알아두기

[안드로이드] MVP와 MVVM 패턴에 대하여

주먹구구식으로 하는 코딩은 스케일이 커져가면서 스파게티 코드가 되기 마련이고, 나중에는 유지보수나 수정이 어렵게 된다. 이러한 이유 때문에 우리는 디자인 패턴을 사용하여 복잡해지고 거대화 되가는 프로젝트를 효율적으로 관리하는 것이다.

오늘은 위에서 설명한 디자인 패턴 중에서 MVP와 MVVM 패턴에 대해서 설명할 것이다.
코딩에는 정답이라는 표현보다는 더 효율적인 방법을 선택하는 것이기 때문에 오늘 설명할 디자인 패턴에 대하여 어떤것이 더 좋다라는 접근보다는, 이 패턴이 내가 하는 프로젝트에는 더 효율적이다라는 접근을 하는 것이 더 좋다.

1. MVP 패턴 (Model + View + Presenter)

  • Model - Presenter에게 넘겨받은 데이터를 관리해주는 클래스
  • View - MainActivity.kt와 같은 사용자에게 보여지는 화면에 대한 이벤트를 처리하는 부분
  • Presenter - Model과 View를 연결하여 동작을 처리


예시를 들어서 좀 더 자세하게 설명하겠다. 화면에 숫자를 입력하는 EditText 2개와 버튼이 1개 있다고 가정하자. 그리고 버튼은 EditText에 있는 2개의 값을 더해주고 더해준 값을 Display 해주는 역할을 한다. 위 행위를 절차적인 방법으로 풀어쓰면 아래와 같다.

  1. 사용자가 EditText 2개에 숫자를 입력한다.
  2. 사용자가 버튼을 누른다.
  3. EditText에서 숫자 2개를 추출한다.
  4. 숫자 2개를 더한다.
  5. 숫자 2개의 합을 TextView에 보내서 표시한다.


각 절차별로 MVP를 따져보자.

  • View - MainActivity.kt 와 같은 파일에서 해당 화면에서 Button을 클릭하면 2개의 숫자를 추출해주는 역할을 한다. 그리고 추출된 값을 Presenter에 보내준다.
  • Presenter - View에서 받은 값을 더해준다. 그리고 더한 값을 Model에 보내서 저장한다. 저장한 값을 다시 Presenter에 가져와서 View에 보내서 값을 표시하게 해준다.
  • Model - Presenter로부터 넘겨받은 두 숫자를 더한 값을 저장해준다.


이렇게 View와 Model이 Presenter를 사이에 두고, 데이터를 넘겨주고 저장하고 넘겨받고 표시하는 것이 MVP패턴이다. 이러한 MVP 패턴에서 원한다면, Presenter에서 View를 참조할 수 있다는 점이 있다. 하지만 Presenter의 몸집이 점점 커지다보면, 자칫 코드를 재활용하기 힘들 수 있다는 점 때문에 유의해서 사용해야 한다.

2. MVVM 패턴 (Model + View + View Model)

  • Model - ViewModel에서 넘어오는 데이터를 저장하거나 fetch 해주는 역할
  • View - View와 관련된 이벤트들 처리
  • ViewModel - View가 사용할 메소드와 필드를 구현하고, View에서 필요한 데이터를 가공하여 View가 어떤 형식으로 UI를 표시할지 결정하는 데이터를 제공


위 세가지 요소를 좀 더 풀어서 설명하면 Model은 일종의 SQLite 저장소와 같다. 데이터를 저장하기도 하고 ViewModel에서 원하면 데이터를 꺼내주기도 한다. 그래서 DB를 구성하는 Repository, Entity, DAO가 Model의 구성요소가 된다.

ViewModel은 UI와 관련 없는 작업들을 주로 하게 된다. 만약 Model에서 데이터를 fetch 해야하는 상황이 생기게 된다면, View가 아닌 ViewModel에서 Model에 요청을 해서 데이터를 갱신하게 되는 것이다.

View는 단순히 UI와 관련된 작업들을 처리하는 것이다. 해당 버튼을 눌렀을 때, 다른 액티비티로 넘어갈지, 혹은 특정 값을 표시할지말지(이떄 특정 값은 VIewModel에서 넘겨준다.) 말이다.

위에서도 얘기했지만, 두 패턴중에서 '요즘 대세가 MVVM 패턴이니까 난 MVVM 패턴을 사용해야지!' 라기보다 사용자가 두 패턴중에서 나에게 더 적합한 것을 판단하여 골라서 사용하길 바란다.

참고자료
https://blog.yena.io/studynote/2019/03/16/Android-MVVM-AAC-1.html

[Android] MVVM & 안드로이드 아키텍쳐 컴포넌트 시작하기

(나를 포함한) 안드로이드 개발을 처음 시작하는 사람들은 대부분 액티비티에 거의 모든 코드를 직접 넣는다. 하지만 시간이 갈수록 액티비티는 점점 무거워지고, 수정이나 유지 보수 하기가 힘

blog.yena.io

https://velog.io/@k7120792/Model-View-ViewModel-Pattern

MVVM 패턴

나의 첫 디자인 패턴 MVVM 패턴을 알아보자 🧐

velog.io

https://velog.io/@cchloe2311/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-MVP-MVVM-%ED%8C%A8%ED%84%B4

[안드로이드] MVP, MVVM 패턴

Prensentation layer의 MVP, MVVM 패턴을 알아보자

velog.io

https://developer.android.com/jetpack/guide

앱 아키텍처 가이드  |  Android 개발자  |  Android Developers

앱 아키텍처 가이드 이 가이드에는 고품질의 강력한 앱을 빌드하기 위한 권장사항 및 권장 아키텍처가 포함되어 있습니다. 이 페이지는 Android 프레임워크 기본을 잘 아는 사용자를 대상으로 합

developer.android.com