본문 바로가기

iOS

[iOS] MVC, MVVM 디자인 패턴

최근  마주친42 앱을 수정하고 업데이트를 하려던 도중..

해커톤 때만든 코드들이 구조가 제대로 짜여져있지 않았고 각 객체별 역할도 불분명했습니다.

그로 인해 기능을 추가할수록 점점 코드가 보기 어려워지고 이대로는 안된다고 판단하였습니다.

한동안 앱 업데이트를 잠시 멈추고 제 자신을 업데이트 할 시간을 가져보겠습니다.

 

이를 해결하기 위해 디자인 패턴을 공부를 해보겠습니다.

 

제가 생각하는 디자인 패턴은 코드들을 역할 및 기능에 맞게 잘 이쁘게 분할시키는 것입니다.! 

 

 

MVC

 

Model, View, Controller

 

Model은 애플리케이션에서 사용할 데이터를 관리 구조체나 클래스!

View는 유저 인터페이스를 표현 및 관리 앱 화면에 보이는 UIView 애들 

Controller는 View와 Model의 다리 역할을함 UIViewController 애들 

 

내가 이해한 MVC

View 앱에서 버튼을 누르는 등 액션을 취하면 Controller에게 알림 그리고 Controller는 View에게서 받은 정보로 Model (data)를 Updates시키고 Model은 Updates 완료됬다고 Controller에게 알리고 Controller는 View에게 Model의 변경된 정보를 앱화면에 업데이트함

 

MVC의 단점

Model과 View에 넣기 에매한 코드들은 Controller에 넣는 경향이 있어서 Controller가 점점 무거워짐 (Massive View Controller....)

 

애플의 MVC

애플의 MVC패턴은 기존과 약간 다른게 Controller가 View의 Cycle을 관리하기 때문에 아주 밀접한 영향이 미칩니다.

Controller가 거의 View역할까지 다해버립니다. .!! 그래서 기존의 MVC보다 더욱 무거워지고 Controller가 해야할 일들의 책임을 강하게 가지고 있습니다.  (각각의 M, V, C가 독립적이지 않습니다.)

 

엄청 강하게 연결 되어있습니다.. controller가 View의 Life Cycle도 관여를 하게되고 독립성이 모호해집니다.

 

MVVM

 

 

우리의 Massive View Controller 를 대체하기 위해

 

MVVM 두둥등장!

 

Model, View, ViewModel이 됬습니다.

 

MVC에서의 ViewController가 View로 가고 

ViewModel이 새로 생겼다고 생각하면 쉽습니다. 

(주로 reactive programming (reactivecocoa, RxSwift등)에서 많이 사용하는 패턴! 이라고 합니다.)

 

ViewModel이 그냥 다리 역할한다고 보면 됩니다.

MVC에서는 Controller가 Model와 서로 대화를 하였지만 MVVM에서는 ViewModel을 통해서 대화해야한다.

기존의 Model과 View를 확실히 독립시켰습니다!!!!!

 

제가 이해한 MVVM

ViewModel안에 Model을 두고  ViewModel이 Model을 관리 하게됩니다. 필요한 data는 ViewModel한테 달라고 하고 ViewModel은 그 데이터를 잘 처리해서 Name이면 Model에서 데이터를 추려서 이름을 반환하고, 전화번호 줘!해도 Model에서 데이터 추려서  전화번호 반환하는 것 같습니다. 나머지 흐름은 MVC와 비슷하게 느껴집니다.

 

간단한 코드 예시

\

ViewController안에 trackManager를 만들어줍니다. 이 친구가 ViewModel의 역할을 합니다.

기존에 MVC모델을 할 때는 ViewController에 수많은 변수들을 두고 구조체를 뒀지만 ViewModel이 그런 model들을 전부 관리합니다. 즉 ViewModel을 통해서만 Model에 접근할 수 있습니다.

 

ViewModel 클래스를 간단히 보면 . 모든 Model들을 다 가지고 있고 View에게 필요한 정보들을 ViewModel에서 return해줍니다.

 

P.S. 

viper라는 것도 있습니다.

제가 생각 한 디자인 패턴은 코드들을 어떻게 효율적으로 분산해서 관리할지 정하는 규칙같은 것 같습니다. 

'iOS' 카테고리의 다른 글

[iOS] animation - animate  (0) 2021.04.04
[iOS] Collection View 컬렉션 뷰  (0) 2021.04.01
[iOS] perfromSegue  (0) 2021.03.29
[iOS] 간단한 메모리 구조 - remind  (0) 2021.03.28
[iOS] Xcode Preview기능  (0) 2021.03.22