본문 바로가기

iOS 앱 개발자 프로젝트

[iOS] MVC (Model-View-Controller)

2024년 4월 5일 금요일

 

이번 주 팀 프로젝트를 진행하기 앞서 Xcode IDE에서 M,V,C 폴더를 각각 만들어 파일을 분리하는 작업을 했는데 MVC 패턴이라 불리는 이 구조화 된(설계) 패턴이 무엇인지 정리해 봅니다. 


 

MVC 패턴은 Model-View-Controller 패턴의 줄임말으로, 세 가지 계층에서 각 코드의 책임과 역할을 나눈다. 

 

 

 

 

 

Model

 

데이터와 관련된 내용을 담고 있으며, 데이터를 관리하는 로직도 포함하고 있다. 네트워크를 통해 받아온 DTO 구조체와 네트워크에 접근하는 로직, 파일로 따로 저장해야하는 Persistance한 데이터를 로드한다든가, 아니면 필요한 구조체를 만드는 경우 해당 내용들은 모두 Model에 포함된다.

 

Model은 UI와 직접적으로 연결되지 않는다. 불가능한 것은 아니지만 MVC 패턴을 제대로 활용하기 위해서는 Model은 받아온 데이터를 그에 맞춰 저장할 형태를 만드는 것이 중요하지 UI에서 어떻게 보일지는 신경쓰지 않는 것이 좋다. 예를 들면, Person이라는 구조체에 생일을 저장하는 것은 괜찮지만, 이 생일 날짜 문자열을 어떤 식으로 파싱해서 어떤 식으로 화면에 띄워줄지는 고민하지 않아도 된다.

 

Model에는 이런 코드들이 포함된다.

  • 데이터로 사용하는 구조체: 위에서 예시로 든 Person 구조체 같은거라고 생각할 수 있을 것 같다. struct Person {let name, birthDate} 이런 느낌.
  • 네트워크 로직: 네트워크 요청을 하고, 그 결과를 받아오는 기본적인 기능을 담은 네트워크 로직이 포함된다.
  • Persistance 로직: 메모리에 저장되는 데이터를 로드 및 세이브하는 로직이 포함된다.
  • 데이터 파싱 로직: 네트워크로 받아오든 내부 파일에서 받아오든, JSON 같은 데이터가 왔을 때 이를 파싱하는 로직도 포함한다.
  • Manager 객체(shared 객체): 구조체를 만들어두고 필요한 경우에는 어디서든 접근해 사용할 수 있도록 따로 Manager를 만드는 경우도 Model에 포함된다.
  • Util, Extension, Constant: 앱으로 따지면 우리가 정의하는 Color나, String의 추가적인 기능, 혹은 특정 사이즈에 대한 정보를 util, extension, constant로 많이 만들게 되는데, 이런 경우도 Model에 포함된다.

 

View

 

View는 흔히 말하는 UI. 유저들에게 데이터를 보여주고, 어떻게 보여줄지 화면을 구성하는 코드들이 포함되어있다. 또한 View 계층은 직접 유저와 상호작용을 해야 하는 곳이다보니, 상호작용을 Controller 계층으로 전달하는 역할도 한다.

 

기본적으로 View는 Controller로부터 정리된 데이터를 받아서 화면에 보여주는 역할을 하지만, 데이터를 저장하면 안되는 것은 아니다. 간단한 정보들은 View에서 정의해서 사용할 수 있다. 상태와 관련된 변수를 View에서 정의해 사용하는 경우도 많다.

 

View를 작성할 때 재사용성이 강조된다. 화면에 들어가는 여러 요소들을 어떻게 나누어 앱 전반에서 재활용할 수 있도록 할지가 중요하다. 예를 들면, 앱 전반에서 일관적으로 사용되는 디자인의 버튼이 있다면 필요할 때마다 해당 디자인을 다시 코드로 작성하는 것이 아니라, 재사용할 수 있도록 MyButton을 별도로 만들어서 관리하면 코드가 깔끔해질 것이다.

 

View에는 아래의 코드들이 포함된다.

  • 주로 UIView를 상속해 만들어진 subclass
  • Core Animation
  • Core Graphics

 

Controller

 

Controller는 앱의 핵심 로직을 담고 있는 계층이다. Controller는 View, Model에 연결되어 그 중간의 역할을 하고 있다. MVVM 패턴에서 ViewModel이 하고 있는 역할과 비슷하다고 볼 수 있다.

 

View에서 보여주기 위한 데이터를 이 Controller가 보내주면서 View를 refresh하고, 그 데이터를 Model으로부터 가져오는 기능을 한다. 물론 View로부터 유저와의 상호작용에 대한 정보를 받고, 그 정보를 바탕으로 해당된 로직을 실행하고 Model의 정보를 업데이트하는 기능도 있다.

 

Controller는 해당 View마다 하나씩 붙어서 그 View에 맞는 로직을 포함하고 있기 때문에, 재사용성은 View보다 훨씬 떨어진다. 재사용성이 적다보니 코드가 길어지는 경우가 많다.

 

Controller와 UIKit UIViewController?

 

Controller는 Model과 View에 모두 연결되어있기 때문에, 그 역할에 따라 또 두 가지로 나눌 수 있다.

 

첫 번째는 Model Controller고, 이 경우엔 Controller가 Model을 가지고 있다. 이 Model Controller는 Model의 데이터를 관리하고, View에 데이터를 전달하는 역할을 한다.

 

두 번째는 View Controller고 이 경우에는 Controller가 View를 가지고 있다. View를 관리하고 유저와의 상호작용도 관리하며, Model의 데이터를 업데이트하는 역할을 한다.

 

UIKit의 UIViewController와 Controller 계층은 어떤 관계가 있는가..

 

 

 

UIViewController가 Controller와 비슷한 역할을 하기는 한다. UIViewController는 그가 하나의 Root View를 관리하며, 그 아래 있는 많은 subView들까지 관리한다.

 

UIViewController가 주로 하는 역할 (Controller 계층이 맡아야 하는 역할 다수)

  • Model로부터 받아온 데이터의 변화에 따라 View를 업데이트
  • 유저와의 상호작용에 반응
  • View의 Layout을 관리하고 Resize함
  • 다른 객체와 상호작용

 

Reference (거의 퍼왔다.. ) 

 

iOS 개발 - MVC 패턴과 UIKit의 ViewController

Model, View, Controller에 대해 알아보고, iOS 개발에서의 ViewController과 그 사용 예시에 대해 알아보자.

medium.com