본문 바로가기
공부/[개발 관련]

[개발 관련] MVC(Model-View-Controller)디자인 패턴에 대하여

by 인생은아름다워 2022. 1. 29.

✏️ Model - View - Controller Design Pattern

여러개의 디자인 패턴 중 MVC디자인 패턴은 iOS앱 개발에 적용되는 디자인 패턴이다. iOS 애플리케이션 개발을 위해서 잘 이해해야 하는 개념일 것이다. 여기서 각 요소(모델, 뷰, 컨트롤러)의 역할에 대해 정확하게 이해하고, 구분해야 한다. 그래야 뷰의 재사용과 올바른 데이터 흐름으로 애플리케이션을 개발할 수 있다.

MVC디자인 패턴은 애플리케이션의 객체를 Mode, View, Controller중 하나의 역할로 할당한다. 그럼 각 객체는 해당 하는 역할을 수행할 것이며 뿐만 아니라, 각 유형간의 통신 방식까지 정의한다.

세 유형의 객체는 추상적인 경계에 의해 다른 유형의 객체와 구분되고, 그 경계를 넘어 다른 유형의 객체와 통신한다.(패턴에서 정한 방식을 통해서 하겠지?)

애플리케이션에서 특정 MVC유형을 하나로 모아서 레이어 라고 한다.(ex: 모델 레이어)

MVC 디자인패턴은 코코아 애플리케이션 디자인의 핵심이다. 이 패턴을 채택 함으로서, 많은 애플리케이션들은 재사용성이 증가하고, 이를 통해 개발된 애플리케이션이 다른 애플리케이션 보다 더 쉽게 확장되기도 한다.

✏️ Model Object

모델 객체는 애플리케이션에 특정한 데이터를 캡슐화 하며, 그 데이터를 조작하고 처리하는 로직과 연산들을 정의한다. 예를 들어서 모델 객체는 게임속의 캐릭터, 또는 연락처 등이 될 수 있다. 모델 객체는 다른 모델 객체와 일대일 또는 일대다 관계를 맺을 수 있다.

다시 말해서 모델 객체데이터의 캡슐화와 관련된 객체라고 간단하게 정의하면 될 것 같다. 그 말을 다시 하면, 데이터를 사용자에게 제공하거나 사용자가 이를 편집할 수 있는 뷰 객체에 명시적으로 연결되면 안된다!

다음은 모델 서브클래스를 구현할 때, 클래스 디자인에서 고려할 사항 들이다.

(사실 이 내용들은 이해가 안되는 부분들이 존재한다. 필요 시 다시 찾아보기 위해 그럼에도 기록차원으로 정리 해둔다.)

 

인스턴스 변수

캡슐화된 변수를 유지하기 위해 인스턴스 변수를 선언한다. 인스턴스 변수는 객체, 스칼라 값, 또는 NSRange와 같은 struct일 수 있다. 비객체형 대신 객체형을 사용하는 데에는 장단점이 있으니, 객체 상호관계(object mutuality)를 고려해야 한다.

 

접근자 메서드와 프로퍼티

접근자 메서드는 일반적으로 인스턴스 변수 값을 획득 또는 설정한다. 흔히 getter & setter라고 알려져있다. Swift에서 인스턴스 변수를 private 또는 fileprivate을 통해 접근제한을 하는 경우 인스턴스 외부(fileprivate의 경우 파일 외부)에서 접근하려면 접근자 메서드가 필요하다.

 

키-값 코딩

접근자 메서드(또는 암시적으로 선언된 프로퍼티)의 이름 지정이 이 매커니즘의 요소가 된다.

키-값 코딩은 클라이언트가 프로퍼티 이름을 키로 사용하여 객체의 프로퍼티에 접근할 수 있게 하는 매커니즘이다. Core Data에서 사용하고 있으며 Cocoa의 다른 곳에서도 사용하고 있다.

 

초기화 및 할당 해제

대부분의 모델 클래스는 인스턴스 변수를 적절한 초깃값으로 설정하는 initializer method를 구현한다. 여기서 초기화는 initializer method의 표준 형식을 따라야 하며, deinit메서드에서 객체 값을 가지는 모든 인스턴스 변수를 해제해야 한다.

 

객체 인코딩

모델 클래스의 객체를 보관하려는 경우, 해당 객체의 인스턴스 변수를 인코딩 및 디코딩할 수 있어야 한다.

 

객체 복제

클라이언트가 모델 객체를 복제할 것으로 예상하는 경우, 클래스에서 객체 복제를 구현해야 한다.

✏️ View Object

뷰 객체는 애플리케이션에서 사용자가 볼 수 있는 객체이다. 자신이 보여지는 방법을 알고 있으며, 사용자 동작에 응답할 수 있는 객체이다. 뷰 객체의 주 목적은 애플리케이션에서 모델객체의 데이터를 보여주고, 이 데이터를 편집할 수 있도록 하는 것이다. 그렇다 하더라도 모델 객체와 명시적으로 연결되면 안되고, 분리되어야 한다! 주소록을 예를 들자면, 사용자에게 보이는 전화번호와 정보들이 보이는 화면들이 되겠다.

✏️ Controller Object

컨트롤러 객체는 하나 이상의 애플리케이션 뷰 객체와 하나 이상의 모델 객체 사이의 중개자 역할을 한다. MVC 디자인 패턴에서 컨트롤러 객체(또는 컨트롤러 라고도 함)는 사용자의 액션(예를 들어서 버튼을 클릭, 텍스트 입력 등)을 인지하고, 사용자의 의도대로 해석하며, 신규 혹은 변경된 데이터를 모델 객체에 전달한다.

컨트롤러 객체뷰 객체에게 모델 객체의 변경사항을 인지하게 하거나, 반대로 모델 객체에 뷰 객체의 변경사항을 인지하게끔 하는 개체이다. 컨트롤러 객체는 애플리케이션의 설정 및 조정 작업을 수행할 수도 있으며, 다른 객체들의 생애주기(life cycle)을 관리하기도 한다.

iOS의 Cocoa Touch Framework는 Coordinating Controllers와 View Controllers의 두 가지 기본 컨트롤러 유형을 제공한다.

 

Coordinating Controllers(코디네이팅 컨트롤러) 

Coordinating controller는 애플리케이션 전체 또는 일부 기능을 감독하고 관리한다. 애플리케이션 별로 다른 로직이 각 애플리케이션에 inject되는 장소라고 할 수 있고 이 기능은 아래와 같다. 

  • delegation 메시지에 응답하고 notifications을 관리한다.
  • 사용자가 버튼과 같은 컨트롤을 탭 하거나 클릭함에 따라 전송되는 action message에 응답한다.
  • owned 객체의 생명 주기를 관리한다.
  • iOS 애플리케이션의 경우 View Controller가 Coordinate Controller의 역할을 겸임하는 경우가 많다.

View Controllers(뷰 컨트롤러)

  • UIKit에서 뷰 컨트롤러는 컨텐츠를 화면에 표시하고 관리한다. 또한 뷰에 대한 reference를 유지하고 뷰의 presentation과 후속 뷰로의 전환을 관리한다. 이런 것과 관련된 모든 presentation 동작 뷰 컨트롤러 객체에 의해 관리되며 구현된다. 그리고 모달 뷰를 표시하고 메모리 부족 경고에 응답하며 기기의 orientation이 바뀐다면 뷰를 회전시키기도 한다.
  • iOS의 ViewController는 UIViewController 서브클래스의 인스턴스이다. UIKit은 여러 특수목적 서브클래스를 제공한다.(ex: UITableViewController)
  • 컨트롤러가 모델과 뷰 간의 데이터를 중개하도록 반드시 프레임워크의 ViewController class(UIKit의 경우 UIViewController, UITableViewController)를 확장해야 한다. ViewController는 여러가지 프레임워크 객체에 대한 delegate혹은 데이터 소스 객체인 경우가 많다.

🍎 결론

iOS 앱 개발을 처음 공부하는데 사실 MVC 디자인 패턴은 UIKit으로 개발하는 때의 디자인 패턴인 것으로 알고 있다. 만약 SwiftUI를 공부하고자 한다면 MVVM의 디자인 패턴을 공부해 보기도 해야한다!

사실 boost course 의 iOS 앱 프로그래밍과 공식문서를 해석하며 공부해보긴 했지만, 낯선 단어들과 이해가 되지 않는 개념들이 분명히 많이 있다. 이 부분은 꼭 되짚어봐야 한다.

🗒️ 참고문서

**developer.apple/MVC - 각요소에 대한 설명**

**developer.apple/MVC - MVC 디자인 패턴에 대한 설명**

댓글