이 포스트는 edwith의 iOS 부스트캠프 강의를 듣고 정리한 내용 입니다.


MVC Design Pattern 학습 시 중요한 점

  • 객체별 역활을 명확히 이해해야 한다.

  • 각각의 할일을 적절하게 구분해야 한다.

    • 위의 두 가지 모두 학습 시 중요한 점이다.

      • 그 이유는 위의 두 가지를 모두 이해하고 구분해야 1. 뷰의 재사용과 2. 올바른 데이터의 흐름을 알 수 있으며 활용할 수 있다.

Model - View - Controller

  • MVC (Model-View-Controller) 디자인 패턴

    • 애플리캐이션의 객체를 모델, 뷰 컨트롤러 세 가지 역활 중 하나의 역활로 할당한다.

    • MVC 패턴은 애플리케이션 내에서 객체가 수행하는 역활 뿐만 아니라 객체가 서로 통신하는 방식을 정의한다.

  • 세 가지 유형의 객체는 각각의 추상적인 경계에 의해 다른 객체와 구분된다.

  • 그 경계를 넘어 다른 유형의 객체와 통신한다.

  • 애플리케이션 내의 특정 MVC 유형을 한데 모아 레이어 (예 : 모델 레이어) 라고도 한다.

MVCImage


Model Objects (모델 객체)

  • 애플리케이션과 관련된 데이터를 캡슐화, 해당 데이터를 조작하고 처리하는 로직과 계산을 정의.

  • 하나의 모델 객체는 다른 모델 객체와 일대일 대응 관계를 맺을 수 있다.

  • 모델 객체는 데이터를 사용자에게 제공하거나 사용자가 이를 편집할 수 있는 뷰 객체에 명시적으로 연결되어서는 안된다.

    • 즉, 사용자 인터페이스나 표시 문제와 관련이 있어서는 안된다.

잘 설계된 모델 클래스

  • 모델 클래스

    • 즉, 모델 객체를 생성하는 클래스

      • 모델 클래스가 Core Data Technology를 사용하고 있는 경우 NSManagerdObject 서브 클래스를 많이 사용한다.

      • Objective-C 언어를 사용하는 경우 모델 클래스는 일반적으로 NSObject의 서브클래스이다.

      • Swift를 사용하는 경우에는 특별한 경우가 아니라면 NSObject를 상속받지 않는다

      • 또, 값 타입의 모델이 필요한 경우 클래스 대신에 구조체를 활용하기도 한다.


모델 서브클래스를 구현할 때, 클래스 디자인에서 다음 사항을 고려해야한다.

  • 인스턴스 변수

    • 애플리케이션 내에 캡슐화된 데이터를 유지하기 위한 인스턴스 변수를 선언한다.

      • 인스턴스 변수는 객체, 스칼라 값 또는 NSRange와 같은 구조체(structure)일 수 있다.

      • 비객체형(nonobject types)대신 객체형을 사용하는 데에는 장단점이 있으므로, 객체 상호 관계(object mutuality)를 고려해야 한다

  • 접근자 메서드(Accessor methods)와 프로퍼티

    • 접근자 메서드는 일반적으로 인스턴스 변수값을 획득 및 설정(get, set)

      • getter and setter methods 라고도 알려져 있다.

      • Swift를 사용하는 경우, 인스턴스 변수를 private 또는 fileprivate 등으로 접근을 제한 한 경우, 인스턴스 외부에서(fileprivate의 경우는 다른 소스파일에서) 접근하려면 접근자 메서드가 필요하다.

  • 키-값(Key-Value) 코딩

    • 키-값 코딩은 클라이언트가 프로퍼티 이름을 키로 사용하여 객체의 프로퍼티에 접근할 수 있게 하는 메커니즘

    • Core Data에서 사용하고 있으며 Cocoa의 다른 곳에서도 사용하고 있다.

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

  • 초기화 및 할당 해제 (Initialization and Deallocation)

    • 대부분 모델 클래스는 인스턴스 변수를 적절한 초깃값으로 설정하는 이니셜라이저 메서드를 구현한다.

    • 초기화는 이니셜라이저 메서드의 표준 형식을 따라야 한다.

    • deinit 메서드에서 객체 값을 가지는 모든 인스턴스 변수를 해제해야 한다.

  • 객체 인코딩

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

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