MVC Design Pattern(2)
이 포스트는 edwith의 iOS 부스트캠프 강의를 듣고 정리한 내용 입니다.
MVC Design Pattern 학습 시 중요한 점
-
객체별 역활을 명확히 이해해야 한다.
-
각각의 할일을 적절하게 구분해야 한다.
-
위의 두 가지 모두 학습 시 중요한 점이다.
- 그 이유는 위의 두 가지를 모두 이해하고 구분해야 1. 뷰의 재사용과 2. 올바른 데이터의 흐름을 알 수 있으며 활용할 수 있다.
-
Model - View - Controller
-
MVC (Model-View-Controller) 디자인 패턴
-
애플리캐이션의 객체를 모델, 뷰 컨트롤러 세 가지 역활 중 하나의 역활로 할당한다.
-
MVC 패턴은 애플리케이션 내에서 객체가 수행하는 역활 뿐만 아니라 객체가 서로 통신하는 방식을 정의한다.
-
-
세 가지 유형의 객체는 각각의 추상적인 경계에 의해 다른 객체와 구분된다.
-
그 경계를 넘어 다른 유형의 객체와 통신한다.
-
애플리케이션 내의 특정 MVC 유형을 한데 모아 레이어 (예 : 모델 레이어) 라고도 한다.
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 메서드에서 객체 값을 가지는 모든 인스턴스 변수를 해제해야 한다.
-
-
객체 인코딩
- 모델 클래스의 객체를 보관하려는 경우, 해당 객체의 인스턴스 변수를 인코딩 및 디코딩할 수 있어야 한다.
-
객체 복제
- 클라이언트가 모델 객체를 복제할 것으로 예상하는 경우, 클래스에서 객체 복제를 구현해야 한다.