이 포스팅은 iOS BoostCourse 시리즈 23 편 중 6 번째 글 입니다.

  • Part 1 - 01: Asset, App thinning
  • Part 2 - 02: Foundation, UIKit
  • Part 3 - 03: Auto Layout
  • Part 4 - 04: View 체계
  • Part 5 - 05: 디자인 패턴
  • Part 6 - This Post
  • Part 7 - 07: Apple Development Documents
  • Part 8 - 08: Human Interface Guidelines
  • Part 9 - 09: 화면 전환
  • Part 10 - 10: 뷰의 상태 변화 감지
  • Part 11 - 11: Delegation
  • Part 12 - 12: Singleton
  • Part 13 - 13: Target-Action
  • Part 14 - 14: Gesture Recognizer
  • Part 15 - 15: TableView
  • Part 16 - 16: Segue
  • Part 17 - 17: Json 다루기
  • Part 18 - 18: PhotoKit
  • Part 19 - 19: 동시성, 비동기, 병렬 프로그래밍
  • Part 20 - 20: OperationQueue
  • Part 21 - 21: SchrollView
  • Part 22 - 22: Naviagtion item, Bar button item
  • Part 23 - 23: CollectionView
▼ 목록 보기

Model-View-Controller

imageMVC

  • iOS 앱 개발에서는 MVC 디자인 패턴을 사용
  • 애플리케이션의 객체를 모델, 뷰, 컨트롤러의 세가지 역할 중 하나로 할당하는 것
  • 각각의 객체에서 수행하는 역할을 정의
  • 또한 그 객체들이 통신하는 방식 역시 정의

Model Objects

  • 애플리케이션과 관련된 데이터를 캡슐화
  • 데이터를 조작하고 처리하는 로직, 계산을 정의
  • 하나의 모델 객체는 다른 모델 객체와 일대일 또는 일대다 대응 관계를 맺을 수 있음, 다대다도 가능
  • 모델 객체는 사용자 인터페이스, UI 표시 문제와 관련이 없어야 함
  • 즉 분리되어서 존재하여야 함

잘 설계된 모델 클래스

  • 모델 객체를 생성하는 클래스는 Core Data technology를 사용한다면 NSManagerdObject 서브 클래스를 많이 사용
  • Objective-C 인 경우 보통 NSObject의 서브 클래스
  • 스위프트인 경우 NSObject를 잘 상속받지 않음
  • 값 타입의 모델이 필요한 경우 클래스 대신 구조체를 활용하기도 함

고려사항

  • 인스턴스 변수
    • 애플리케이션 내에 캡슐화된 데이터를 유지하기 위한 인스턴스 변수를 선언
    • 객체, 스칼라 값, 구조체가 가능
    • 객체형 또는 비객체형을 사용하는 데에는 장단점이 있으므로 “객체 상호 관계”를 고려해야 함
      • 객체 상호 관계는 UML 다이어그램에서 보았던 객체간의 관계를 말함
  • 접근자 메서드(Accessor methods)와 프로퍼티
    • 인스턴스 변숫값을 획득하거나 설정
    • getter and setter methods라 불림
    • 변수를 private, fileprivate로 접근을 제안한 경우 외부에서 접근하기 위해서는 접근자 메서드가 필요하다.
  • 키-값 (key-value) 코딩
    • 클라이언트가 프로퍼티 이름을 키로 사용하여 객체의 프로퍼티에 접근할 수 있도록 하는 메커니즘
    • Core data에서 사용중
  • 초기화 및 할당 해제
    • 대부분의 모델 클래스는 인스턴스 변수를 적절한 초깃값으로 설정하는 init 메서드를 구현함
    • deinit에서는 인스턴스 변수를 해제
  • 객체 인코딩
    • 모델 클래스의 객체를 보관하려는 경우, 해당 객체의 인스턴스 변수를 인코딩 및 디코딩할 수 있어야 한다.
  • 객체 복제
    • 클라이언트가 모델 객체를 복제할 것으로 예상하는 경우, 클래스에서 객체 복제를 구현해야 함

View Objects

  • 어플리케이션 내에서 사용자가 볼 수 있는 객체를 말함
  • 동작에 응답할 수 있음
  • 목적 : 모델 객체의 데이터를 보여주고, 해당 데이터를 편집할 수 있도록 하는 것
  • 하지만 model 객체와 분리되어서 작동함

Controller Objects

imagecontroller

  • 컨트롤러 객체는 하나 이상의 어플리케이션 뷰 객체, 하나 이상의 모델 객체 사이의 중개자 역할
  • 컨트롤러는 사용자의 액션을 받아 해석하고, 변경된 데이터를 모델 객체에 전달
  • 반대로 모델 객체의 변경사항을 인지해서 화면에 보내는 것도 가능
  • 양쪽 객체의 생애주기를 관리하기도 함

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

  • 애플리케이션 전체 혹은 일부 기능을 감독하고 관리
  • 애플리케이션 별로 다른 로직이 각 애플리케이션에 주입되는 장소
  • 기능
    • 델리게이션(delegation) 메시지에 응답하고 알림(notifications)을 관리.
    • 사용자가 버튼과 같은 컨트롤을 탭 하거나 클릭함에 따라 전송되는 동작 메시지(action message)에 응답.
    • 객체 간의 연결을 확립하거나 기타 설정 작업을 수행. (예: 애플리케이션을 시작하는 경우)
    • 소유한(owned) 객체의 생명 주기 관리.
  • iOS 애플리케이션에서는 뷰 컨트롤러가 코디네이팅 컨트롤러의 역할을 겸하는 경우가 많음

뷰 컨트롤러 (View Controllers)

  • 콘텐츠를 화면에 표시하는 뷰를 관리
  • 해당 뷰에 대한 reference 유지
  • 후속 뷰로의 전환을 관리
  • Modal view 표시
  • 메모리 부족 응답
  • 뷰 회전
  • UIViewController 서브 클래스의 인스턴스

생각하기

  • MVP (Model-View-Presenter)
  • MVVM (Model-View-ViewModel)
  • 이 부분은 MVP를 한 이후에 다시 보는 것이 맞다.

Reference

iOS 부스트코스