본문 바로가기
🍎 Swift/iOS 학습 노트

[강의노트👩🏻‍💻] 스위프트 아키텍처 - MVC와 MVVM

by 솔비님 2024. 8. 2.

 

 

1.  아키텍처란?

사전적 의미로는 건축학, 설계학을 뜻한다
개발에서 의미하는 소프트웨어 아키텍처는 개발 프로그램의 구조와 뼈대를 의미한다
iOS 에서 가장 기본이 되는 아키텍처 패턴은 MVC와 MVVM이 있다

 

 

 

2.  MVC

 

MVC란 Model - View - Controller 를 앞 글자를 따온 것이다

각 담당하는 역할은 아래와 같다

  • Model : 데이터 구조 표현 및 데이터 저장 (ex. 연락처앱의 PhoneBook 구조체)
  • View: UI를 표현하기 위한 요소 (ex. UIButton, UITableView..)
  • Controller : Model과 View의 중재자 역할. Model의 데이터를 View에 표현할 수 있도록 도와주며 사용자가 입력하는 Request를 처리한다

 


🍎 애플이 추구한 MVC 아키텍처의 방향성

 

애플이 맨 처음 Swift 언어를 설계할 때 MVC 아키텍처를 추구하며 설계했다

아키텍처는 기본적으로 각 구성요소간의 영역분리와 의존관계가 중요하며 애플이 추구한 목표는 View와 Model의 완전한 분리다

UI를 그리는 로직과 데이터를 다루는 로직은 서로 다른 성격이기 때문에 분리되어 관리하는 것이 좋기 때문이다

 

하지만 MVC패턴에는 View와 ViewController 가 너무 강하게 결합되어 버렸다는 단점이 있다

너무 강하게 결합되는 것은 서로에 대한 의존도가 높다는 것을 뜻하는데, 결국 유지보수에 유리하지 못하다는 단점이 존재하기 때문이다

 

강하게 결합된 이유로는 ViewController가 View의 생명주기와 레이아웃을 모두 관리하기 때문인데

이에따라 View는 스스로 무언가를 수행하기 어려운 구조이고 반드시 ViewController의 도움을 받아야한다

 

데이터의 조작과 네트워크 요청 등도 ViewController안에 작성하게 되는데

페이지에 요구사항이 많아지고 로직이 많아질수록 ViewController가 가져야하는 책임의 양이 너무 비대해진다

 

이러한 흐름에서 나온 아키텍처가 MVVC이다


 

 

3.  MVVM

 

MVVM이란 Model - View - ViewModel 를 의미한다

  • Model : 데이터 구조 표현 및 데이터 저장 (ex. 연락처앱의 PhoneBook 구조체) → MVC와 동일
  • View : UI 요소 + 사용자의 입력 처리 (ex. UIButton, UITableView, UIViewController..)
  • ViewModel : View와 Model의 중재자 역할을 하며 유저 액션을 받지 않는다.
    View가 ViewModel을 관찰하며 UI를 업데이트한다(데이터 바인딩
    ViewModel에서 가지고있는 데이터를 View에서 관찰하며 변경사항이 일어나면 이를 View에 적용한다(옵저버 패턴
    ViewModel은 View의 존재를 정확히 몰라도 된다

 

 

MVVM의 특징

 

1.  UI 로직과 비즈니스 로직이 분리된다

  • UI 로직: 뷰를 그리는 로직
  • 비즈니스 로직: UI 로직이 아닌 앱의 기획사항에 따른 데이터 흐름을 처리하는 로직.

2.  UI 로직과 비즈니스 로직의 분리가 일어났다는 것은 테스트 코드를 작성하기 용이하다는 것과도 같다

3.  UIViewController 의 책임이 MVC 때보다 덜어진다
     예를 들어, 네트워크 통신 코드는 사실 UI 와 관련없는 비즈니스 로직이기 때문에 View가 아닌 ViewModel 안에 코드 작성한다
     그리고 ViewModel 에서 네트워크 통신의 결과로 무언가 값을 받으면,
     내부 Publihser에 이벤트를 발행시키고 View는 그것을 구독하고 관찰하고 있다가 캐치해서 반영한다