Architecture

MVVM in iOS

최지철 2023. 9. 4. 18:04
728x90
반응형

MVVM in WPF (MVVM의 역사)

  • MVVM은 WPF (Windows Presentation Foundation) 및 Silverlight의 기능을 활용하여 이벤트 중심 프로그래밍을 간소화하기 위해 Microsoft 아키텍처 Ken Cooper 및 Ted Peters가 개발했다.
  • XAML (Extensible Application Markup Language)
    • 디자이너를 위한 UI 개발환경
    • 프로그래밍이 필요한 요소를 줄임
    • 선언적인 UI 작성가능

ViewModel in WPF

  • UI에 표시할 상태와 로직을 작성
  • UI에서 발생한 이벤트(버튼클릭등)를 위임받아 처리
  • ViewModel에서 발생한 변경을 UI에 반영

  • 전통적인 개발자보다 디자이너를 위한 UI 개발환경 제공
    • 기존 XML, HTML 보다 쉬운 XAML이라는 마크업 언어 사용
  • ViewModel
    • 뷰에서 DataContext를 지정하면 데이터 바인딩 엔진이 XAML로 작성한 UI와 뷰모델을 연결시켜주기 때문에 뷰의 참조를 가질 이유가 없다.

 

iOS(UI Kit)에서의 MVVM

  • UI개발과 비 UI 개발 환경을 분리시키고 병행개발을 쉽게하겠다는 목적이 있는가? -> X
  • View와 ViewModel을 연결해주는 데이터 바인딩 엔진이 시스템에 있는가? -> X

본래의 MVVM과 iOS에서의 MVVM은 맥락이 다르다.

  • 그렇다면 왜? MVP과 아닌 MVVM을 선택해야하는가?  -> Reactive Programming

Reactive Programming 아니, 사실상 RxSwift

  • RxSwift의 도입으로 데이터 바인딩을 대체
  • RxCocoa, RxTest등 거의 모든 작업을 Reactive Programming으로 해결하기 위한 도구 제공
  • Notification Center를 활용해서 수동 데이터 바인딩을 할 수 도 있지만, 대부분의 회사에서는 RxSwift를 사용해 MVVM을 구현
  • UI Kit에서의 MVVM 패턴은 RxSwift에 대한 의존도가 상당히 높다.
  • MVC 나 MVP에서도 RxSwift를 사용할 수 있다. iOS환경 (UI Kit)에서 MVVM은 논리적으로 설득력이 다소 떨어져 보인다.
    그럼에도 불구하고 왜?

 

RxSwift를 MVVM에서 사용하는 이유

  • MVP에 비해 가지는 장점이 있다.
    • 프레젠터가 수동적으로 뷰를 갱신하는 작업을 없앨 수 있다.
    • 테스트시 뷰모델이 뷰에 대한 참조를 갖고 있지 않기 때문에, 보다 수월하게 할 수 있다.

그렇다면? 단점은 없는가?

  • 러닝커브가 있다. RxSwift뿐만아니라, 관련(RxCocoa등) 라이브러리에 대해서도 알아야한다.
  • 단순히 뷰모델과 뷰를 바인딩 하기위한 용도 뿐만 아니라, 네트워크 통신, 비동기, 테스트코드등 프로젝트 전체를 재구성해야하는 경우가 많다.

데이터 바인딩

  • RxSwift로 데이터 바인딩을 하려면, RxCocoa를 이용한 수동 바인딩 필요

Model

  • 앱에서 사용되는 데이터 담당
  • 단순 데이터 뿐아니라, dao 와 데이터 유효성 검사

View 

  • 앱에서 보여지는 UI 컴포넌트 및 레이아웃
  • ViewModel의 상태 변화에 대한 UI render
  • ViewLifeCycle 관리

ViewModel

  • model에게 data 업데이트 요청
  • 데이터 가공 및 변환
  • 비지니스 로직 처리
  • model로 부터 data 가져오기
728x90
반응형