꾸준히 안타치기
MVC 패턴(Model - View -Controller) 본문
📘 Model - 데이터 클래스( 프로세스가 동작중일때 메모리(변수)안에 데이터가 있는 상태)
⭐️ Controller | 모델과 뷰를 이어주는 부분
- 모델의 데이터를 해석하고 구성해서 뷰에게 전달한다.
- 뷰에서 발생하는 이벤트를 입력받아 처리 /UI로직
- 뷰와 모델을 변화시키는 알고리즘이나 소스코드가 위치한 곳
📱 View - 화면에 표현 / 사용자 눈에 보이는 모든 것
버튼, UI레이블, 등등 (뷰는 컨트롤러의 하인)
Model - View - Controller
MVC(Model-View-Controller) 디자인 패턴은 애플리케이션의
객체를 모델, 뷰, 컨트롤러의 세 가지 역할 중 하나의 역할로 할당합니다.
이 패턴은 애플리케이션 내에서 객체가 수행하는 역할 뿐만 아니라 객체가 서로 통신하는 방식을 정의합니다.
- 모델과 뷰는 커뮤니케이션이 불가하다. 컨트롤러를 통해서만 가능
- 뷰는 데이터를 가지고 있지 않다. 컨트롤러가 모델에게 이야기해서 가져다 준다.
- 뷰의 버튼이 눌러질때마다 컨트롤러의 타겟을 호출한다. (델리게이트와, 데이터소스 사용)
- 모델이 통신하는 방법에는 Notification & KVO가 있다.
MVC 패턴을 사용하는 이유는?
이 패턴을 따르면 데이터를 수정해도, 비지니스 로직이나 화면코드에 영향을 미치지 않고, 화면을 표현하는 코드를 수정하더라도
비지니스 로직이나 데이터를 관리부분에 영향을 미치지 않아서 프로그램을 유연하게 만들수 있다.
MVC 패턴의 장점
- 코드 재 사용이 용이함
- 단순한 구조로 대중적으로 쓰임
- 여러 인터페이스를 적요하기 에 편함
MVC 패턴의 단점
컨트롤러에 소스코드가 집중되는 경향이 있고 모듈화가 잘안된다.
프로젝트가 복잡하고 커질경우 코드 재사용성과 유지보수가 어렵다.
https://www.youtube.com/watch?v=ogaXW6KPc8I
잘 설계된 모델 클래스
모델 클래스, 즉 모델 객체를 생성하는 클래스는 Core Data technology를 사용하고 있는 경우 NSManagerdObject 서브 클래스를 많이 사용합니다. Objective-C 언어를 사용하는 경우 모델 클래스는 일반적으로 NSObject의 서브클래스입니다. 스위프트 언어를 사용하는 경우에는 특별한 경우가 아니라면 NSObject를 상속받지 않습니다. 또, 값 타입의 모델이 필요한 경우 클래스 대신에 구조체를 활용하기도 합니다.
모델 서브클래스를 구현할 때, 클래스 디자인에서 다음 사항을 고려하세요.
인스턴스 변수 | 애플리케이션 내에 캡슐화된 데이터를 유지하기 위한 인스턴스 변수를 선언합니다. 인스턴스 변수는 객체, 스칼라 값, 또는 NSRange와 같은 구조체(structure)일 수 있습니다. 비객체형(nonobject types)대신 객체형을 사용하는 데에는 장단점이 있으므로, 객체 상호 관계(object mutuality)를 고려해야 합니다. |
접근자 메서드(Accessor methods)와 프로퍼티 | 접근자 메서드는 일반적으로 인스턴스 변숫값을 획득 및 설정하며, 흔히 획득자 및 설정자 메서드(getter and setter methods)라고도 알려져 있습니다. 스위프트의 언어를 사용하는 경우, 인스턴스 변수를 private 또는 fileprivate 등으로 접근을 제한한 경우, 인스턴스 외부에서(fileprivate의 경우는 다른 소스파일에서) 접근하려면 접근자 메서드가 필요합니다. |
키-값(Key-value) 코딩 | 키-값 코딩은 클라이언트가 프로퍼티 이름을 키로 사용하여 객체의 프로퍼티에 접근할 수 있게 하는 메커니즘입니다. Core Data에서 사용하고 있으며 Cocoa의 다른 곳에서도 사용하고 있습니다. 접근자 메서드의 이름 지정 (또한, 암시적으로는 선언된 프로퍼티의 이름 지정)이 이 메커니즘의 요소가 됩니다. |
초기화 및 할당 해제 (Initialization and deallocation) | 대부분 모델 클래스는 인스턴스 변수를 적절한 초깃값으로 설정하는 이니셜라이저 메서드를 구현합니다. 여기서 초기화는 이니셜라이저 메서드의 표준 형식을 따라야 하며, deinit 메서드에서 객체 값을 가지는 모든 인스턴스 변수를 해제해야 합니다. |
객체 인코딩 | 모델 클래스의 객체를 보관하려는 경우, 해당 객체의 인스턴스 변수를 인코딩 및 디코딩할 수 있어야 합니다. |
객체 복제 | 클라이언트가 모델 객체를 복제할 것으로 예상하는 경우, 클래스에서 객체 복제를 구현해야 합니다. |
뷰 객체 (View Objects)
뷰 객체는 애플리케이션 내에서 사용자가 볼 수 있는 객체를 말합니다. 자신이 보이는 방법을 알고 있고 사용자 동작에 응답할 수 있습니다. 뷰 객체의 주된 목적은 애플리케이션의 모델 객체의 데이터를 보여주고 해당 데이터를 편집할 수 있도록 하는 것입니다. 그럼에도 불구하고, 뷰 객체는 MVC 애플리케이션의 모델 객체와는 일반적으로 분리됩니다. 주소록을 예를 들면 전화번호 및 정보가 보이는 화면들을 말합니다.
컨트롤러 객체 (Controller Objects)
컨트롤러 객체는 하나 이상의 애플리케이션 뷰 객체와 하나 이상의 모델 객체 사이의 코디네이터 또는 중개자 역할을 합니다. 모델-뷰-컨트롤러 디자인 패턴에서 컨트롤러 객체(또는 컨트롤러)는 사용자가 버튼을 탭/클릭하거나 텍스트 필드에서 텍스트를 입력하는 것처럼, 뷰 객체에서 이루어진 사용자 동작 및 의도를 해석하며, 신규 혹은 변경된 데이터를 모델 객체에 전달합니다. 따라서 컨트롤러 객체는 뷰 객체로 하여금 모델 객체의 변경사항을 인지하거나, 그 반대의 경우가 가능하도록 하는 매개체가 됩니다. 컨트롤러 객체는 애플리케이션의 설정 및 조정 작업을 수행할 수도 있으며, 다른 객체들의 생애주기(life cycle)를 관리하기도 합니다. iOS 환경의 Cocoa Touch 프레임워크는 코디네이팅 컨트롤러, 뷰 컨트롤러의 두 가지 기본 컨트롤러 유형을 제공합니다.
코디네이팅 컨트롤러 (Coordinating Controllers)
코디네이팅 컨트롤러는 애플리케이션 전체 혹은 일부 기능을 감독하고 관리 합니다. 애플리케이션별로 다른 로직이 각 애플리케이션에 주입(injected)되는 장소라고 할 수 있으며, 그 기능은 다음과 같습니다.
◦ 델리게이션(delegation) 메시지에 응답하고 알림(notifications)을 관리.
◦ 사용자가 버튼과 같은 컨트롤을 탭 하거나 클릭함에 따라 전송되는 동작 메시지(action message)에 응답.
◦ 객체 간의 연결을 확립하거나 기타 설정 작업을 수행. (예: 애플리케이션을 시작하는 경우)
◦ 소유한(owned) 객체의 생명 주기 관리.
• iOS 애플리케이션에서는 뷰 컨트롤러가 코디네이팅 컨트롤러의 역할을 겸하는 경우가 많습니다.
뷰 컨트롤러 (View Controller)
UIKit에서 뷰 컨트롤러는 콘텐츠를 화면에 표시하는 뷰를 관리하며, 해당 뷰에 대한 참조(reference)를 유지하고, 뷰 컨트롤러는 이 뷰의 프레젠테이션(presentation) 및 후속 뷰로의 전환(transition)을 관리합니다. 이와 관련된 모든 프레젠테이션 동작 뷰 컨트롤러 객체에 의해 관리되고 구현됩니다. 또한, 모달뷰를 표시하고 메모리 부족 경고에 응답하며 기기의 방향(orientation)이 바뀔 때 뷰를 회전시킵니다.
iOS의 뷰 컨트롤러는 UIViewController 서브클래스의 인스턴스입니다. UIKit은 UITableViewController와 같은, UIViewController의 여러 특수 목적 서브클래스를 제공합니다. 컨트롤러가 모델과 뷰 간에 데이터를 중개하도록 반드시 프레임워크의 뷰-컨트롤러 클래스(예 : UIViewController, UITableViewController 등)를 확장하십시오. 뷰 컨트롤러는 여러 가지 프레임워크 객체에 대한 델리게이트 혹은 데이터 소스 객체인 경우가 많습니다.
집중력게임 만들어보기
참고
https://www.boostcourse.org/mo326/lecture/16877?isDesc=false
https://www.edwith.org/swiftapp/lecture/26620?isDesc=false
'iOS > 디자인패턴' 카테고리의 다른 글
MVVM + Rxswift + UIkit을 사용하며 알게된 것 (0) | 2023.02.27 |
---|---|
MVVM의 개념과 나오게된 배경 (0) | 2022.10.05 |
싱글턴 패턴 (0) | 2022.05.25 |
프로그래밍 디자인패턴 (0) | 2021.12.16 |