안드로이드 디자인 패턴(MVC/MVP/MVVM/MVI)

WonDDak·2023년 7월 13일
2

Android

목록 보기
1/6

디자인 패턴

안드로이드 앱을 개발할 때, 이용할 수 있는 여러 아키텍처 패턴들이 존재한다.

  • MVC (Model - View - Controller)
  • MVP (Model - View - Presenter)
  • MVVM (Model - View - ViewModel)
  • MVI (Model - View - Intent)

MVC

구성요소

MVC

  • Model : 애플리케이션에서 사용되는 실제 데이터 및 데이터 조작 로직을 처리하는 부분이다.
  • View : 사용자에게 보이는 UI부분이다.
  • Controller : 사용자로부터 액션을 받고 처리하는 부분이다.

다만 모바일 앱 특성상 View/Controller 부분은 Activity에서 통합된다.

장점

  • 구현하기가 쉬워 빠르게 작업이 가능하다.

단점

  • Controller/View가 결합되어있어 테스트가 힘들다
  • 기능을 추가할술록 Activity의 코드가 비대해지기때문에 관리가 더욱 어려워진다.
  • Model과 View의 의존성이 높다.

MVP

MVP

MVC 구조에서 Controller 대신 Presenter를 사용한다.

  • Model : 애플리케이션에서 사용되는 실제 데이터 및 데이터 조작 로직을 처리하는 부분이다.
  • View : 사용자에게 보이는 UI부분이다.
  • Presenter : View에서 요청한 정보를 가공하여 View로 전달하는 부분이다.

장점

  • Model과 View의 의존성이 존재하지 않는다
  • Model은 Presenter의 요청만을 수행한다

단점

  • MVC에 비해 필요한 클래스 수가 증가한다
  • View와 Presenter의 1:1 관계로 인해 의존성 증가한다.
  • 기능이 추가될수록 Presenter가 커지므로 분리하기 힘들다.

MVVM

MVVM

MVVM은 presenter에 의존하지않고, Observe Pattern을 이용해 객체의 변경이 일어날때마다 UI를 갱신한다.

  • Model : 애플리케이션에서 사용되는 실제 데이터 및 데이터 조작 로직을 처리하는 부분이다.
  • View : ViewModel의 데이터들을 구독하고 있다가, 객체가 변할때 UI 업데이트를 진행한다.
  • ViewModel의 : Model과 상호작용하며, View에 종속되지않고 1:N 구조를 갖습니다.

가장 큰 특징은 view의 종속성이 사라졌다는것!

장점

  • View와 Model이 독립되어 있다.
  • ViewModel에서 View 코드가 없기때문에 UnitTest를 쉽게 할수 있다.

단점

  • 데이터 바인딩이 필수적으로 요구 됩니다.(compose는 안해도되지롱~)
  • View에대한 처리가 복잡할수록 ViewModel이 거대해진다

항상 MVVM이야기가 나오면 나오는 Androidx에 있는 AAC ViewModel은 MVVM의 ViewModel과 다릅니다.
LiveData와 StateFlow를 추가하여 MVVM Architecture를 구현한것이기 때문에,
AAC ViewModel을 쓴다고해서 MVVM을 사용한다고 할수 없습니다.


MVI

MVI

  • Model : intent로 전달받은 객체에 맞추어, 새로운 불변객체를 Model로 생성한다.
  • View : Model의 결과물인 상태를 구독하고 있다가, 변경시 UI 업데이트를 진행한다.
  • Intent로 : 앱의 상태를 바꾸려는 의도를 의미합니다.Model에게 앱의 상태를 전달합니다.

Intent는 우리가 아는 그 Intent와 다릅니다. 오해마세요

MVI에서 Model에서 호출되는값은 불변하기에, 예상이 가능한 값이어야 합니다.
다만 서버나 데이터베이스에서 값을 가져올경우,값을 예측할 수 없습니다.
따라서 SideEffect를 통해 제어하게 됩니다.

부수효과(side effect)
원래의 목적과 다르게 다른 효과 또는 부작용이 나는 상태를 의미합니다.
예를들어 네트워크 통신때, 데이터를 가져오는 함수는 데이터를 못가져올수도 있습니다.

MVI2

compose가 도입되면서 상태에따른 변화가 많아졌기떄문에 더욱이 떠오르는 패턴인것 같습니다.

장점

  • 하나의 State객체만을 바라보기 떄문에 상태충돌이 일어나기 어렵습니다.
  • 데이터의 흐름을 파악하기 쉽습니다.

단점

  • Model Update를 위해 새로운 인스턴트를 끼워넣기때문에,리소스가 낭비될수 있습니다.
  • 작은 변경에도 intent를 거쳐야 합니다.
profile
안녕하세요. 원딱입니다.

0개의 댓글