[iOS] iOS 아키텍처 패턴 - MVVM

pom·2023년 4월 2일
post-thumbnail

MVVM : Model, View, ViewModel

🎁 구성

🪅 Model

애플리케이션에서 사용할 데이터들을 관리

🪅 View

  • ViewController를 View로 취급함
  • 유저 인터페이스를 표현 및 관리

🪅 ViewModel

  • Model에 변화를 주고, ViewModel을 업데이트한다.
  • View와 Model 사이를 연결시켜주는 중간 역할 -> Binding(연결고리) 역할
  • Binding으로 View가 업데이트 된다.
    ! 코드 양이 줄어드는 결정적인 역할 !

🎁 작동과정

  1. 입력이 View에 들어옴 ➡️ ViewModel에게 명령
  2. ViewModel: 필요한 데이터를 Model에게 요청
  3. Model: ViewModel에게 요청받은 데이터를 응답
  4. ViewModel: 응답받은 데이터를 가공해서 저장
  5. View는 ViewModel과의 바인딩으로 인해 자동 갱신

사용 예시)
import Foundation

//ViewModel.swift
var gameScore: Int?
var gameScoreLabel: UILabel

func updateGameScoreLabel() {
	var text = ""
    if let gameScore = gameScore, gameScore == 100 {
    	text = "Excellent!"
      } else if let gameScore = gameScore, gameScore >= 90 && gameScore < 100 {
      	text = "Great Job!"
     } else if let gameScore = gameScore, gameScore < 90 {
     	text = "Not bad~"
   } 
   gameScore.text = text
}

//ViewController.swift
gameScoreLabel.text = viewModel.updateGameScoreLabel

일반적으로 ViewController에 View에서 변화가 일어나는 함수들이 정의된다.
그러나 이런 함수들이 점점 많아지면, 코드가 ViewController에 너무 많아질 것이다.

따라서 이런 함수들을 ViewModel에 옮기고, 값들을 미리 세팅한다. 이후 ViewController에서 ViewModel을 선언한 뒤 ViewModel에 있는 함수를 호출한다.


🎁 특징

  • 주로 Reactive programming(ReactiveCocoa, RxSwift 등)에서 많이 사용한다.
  • SwiftUI에서 구현하기 적합하다.
    <이유>
    • ViewController를 강제하는 구조가 아님
    • State를 받아서 화면을 그리는 하나의 함수 형태 ➡️ 특정 State를 View에 바인딩하는 구조
      즉 프레임워크단에서 MVVM 구조를 의도하고 있다.

🪅 장점

  • View와 ViewModel은 서로 알지못하고, 독립성을 가지고 있다. ➡️ 효율적인 유닛테스트 가능
  • 코드 양이 줄어든다.
  • View : ViewModel = N : 1

🪅 단점

  • 간단한 UI에서는 설계가 어렵기 때문에 쓰지 않는 것이 좋다.
  • 데이터 바인딩 필수
    **데이터 바인딩이란? Model과 UI요소 간 싱크를 맞추는 것. 즉 데이터가 변경되면 연결(Binding) 때문에 알아서 UI가 바뀜.
    - Event Bus / Notification Center
    - Delegation
    - Functional Reactive Programming(RxCocoa / RxSwift)
    - 프로퍼티 옵저버 등

참고: https://labs.brandi.co.kr/2018/02/21/kimjh.html
https://velog.io/@eddy_song/ios-mvc

profile
Developer

0개의 댓글