Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

# MVVM 패턴 #55

Open
yoogail105 opened this issue May 16, 2022 · 1 comment
Open

# MVVM 패턴 #55

yoogail105 opened this issue May 16, 2022 · 1 comment

Comments

@yoogail105
Copy link
Owner

들어가기 전에 🔗1. MVC 패턴 🔗2. MVP 패턴

3. MVVM 패턴

image

🤔 MVP와 비교

유사점

  • UIViewController → View
  • View - Model 사이에 긴밀한 연관성이 없다.

차이점

  • View - ViewModel 사이의 binding
  • ViewModel - Model1:N 소통
    • MVP: View - Presenter 간 1:1 소통

🔎 MVVM 역할

  • Model: 비즈니스 로직, data
    • 데이터의 구조를 정의하고, ViewModel에게 결과를 알려줌
    • View와 연결되지 않음
    • 모델은 데이터의 흐름에 대해서 알고 있고, 이 작업들은 ViewModel에 의해 작동되고, 처리를 마치면 ViewModel에게 알려준다.
  • View: UI
    • MVVM에서 UIViewController는 View에 해당
    • 사용자와의 상호작용을 통해 이벤트가 일어나면 ViewModel에게 알려주고, ViewModel이 업데이트를 요청한 데이터를 보여준다.
    • ViewModel에 있는 필드가 변경되는지 관찰하고 있음.
  • ViewModel: 프레젠테이션 로직, View와 Model의 중재자 역할
    • UIKit에 독립적
    • View ↔ ViewModel 사이를 Binding → View 업데이트
    • 모델의 변화를 유발시키고, 업데이트된 모델을 가지고 스스로 업데이트를 한다.
    • 사용자의 상호작용을 View가 보내주면, 그에 맞는 이벤트를 처리

📬 Bindings

  • MVVM에서는 View와, ViewModel간의 의존 관계를 단순화
  • = View만이 ViewModel에 의존하고, ViewModelView를 모른다.
  • → 이 때 ViewModel이 가지고 있는 데이터의 변경을 View에 전달하기 위한 방법
  • ⇒ Data Binding
  • 데이터를 제공하는 자와 데이터를 사용하는 자연결시켜, 동기화 되도록 하는 방식
  • ViewModelViewController가 서로에게 데이터의 변경을 알려주는 방식
  • MVVM은 주로 Reactive cocoa, RxSwift 등의 full scale functional reactive programming과 함께 사용된다.
  • Reactive Cocoa를 사용하면, MVVM의 대부분을 구현할 수 있다.
  • reactive 프레임워크에서 주의할 점은, 어떤 코드를 잘못 짰을 때 앱을 디버깅하는 데에 많은 시간을 보내야 할 수도 있다는 점이다.

📊 MVVM 장단점

📈 장점

  • View, Model이 서로를 알지 못하기 때문에 독립성 유지
  • ViewModel은 UIKit과 독립적, ViewController와의 의존성 X
  • → 효율적인 Unit Test OK
  • View - ViewModel Binding → 코드의 양 감소
  • View : ViewModel = N : 1 관계

📉 단점

  • 간단한 UI 구성에서는 ViewModel을 설계하는 것이 오히려 어려움이 있을 수 있음
  • Data Binding이 필수적으로 요구
  • 동작이 복잡해 질수록 MVC의 ViewController처럼, 비대한 ViewModel 가능성
  • View가 변수와 표현식에 모두 binding될 수 있어 → 관계없는 presentation logic 늘어나면 유지보수 단계에서 어려움을 겪을 수 있음

🖍 MVVM와 좋은 아키텍쳐 요소

  • Distribution: MVP의 View보다 더 많은 책임을 가짐
    • MVP의 View: 책임을 단지 Presenter로 넘기고, 스스로 상태를 업데이트 하지 않음.
    • MVVM의 View: binding을 통해 ViewModel로부터 자신의 상태를 스스로 업데이트
  • Testability: ViewModel은 View를 모른다 → 독립성 → Texstability 높임
  • Ease of use: binding 사용 → 코드의 양 줄어든다.
    • → View를 업데이트하는 추가적인 코드를 작성할 필요가 없다는 이점
    • → testability 여전히 좋음(유지보수 관점에서 +)

🔖 참고

@yoogail105
Copy link
Owner Author

MVVM의 등장: Event-Driven Programming의 관점에서

Event-Driven Programming

  • MVVM은 기존의 Event-Driven Programming을 단순화한 형태
  • EDP: 프로그램은 event의 흐름을 중심으로 개발하려는 패러다임
    • ex. 버튼 → text 표시: 버튼을 누르는 이벤트 발생text표시하는 함수 실행
  • 기존의 MVC에서는 view에서 event가 발생하는 것, 발생 시 호출될 함수 등이 모두 ViewController가 관리 → Massive ViewController

MVVM

image

  • MVVM은 event, model, business logic 등에 대한 책임 → ViewModel에 위임
  • View에서 발생하는 event는 모두 ViewModel로 전달
  • ViewModel은 event가 발생했을 때 지정된 logic을 수행
  • ViewModel은 View에서 사용될 데이터로 변환하여 View에 알림
  • ⇒ event의 흐름이 View → ViewModel로 향하는 단방향 구조
    • event의 흐름을 파악하고, 유지보수하기 쉬운 구조
    • View에서 발생하는 event에 중점을 두고 구조를 설계하되, event를 단방향으로 ViewModel로 전달하여, 복잡도를 낮춘다.

🔖 참고

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant