Design Patterns #Section01 MVC(01) - Model, View, Controller

๐Ÿ“Œ MVC(01) - Model, View, Controller

๐Ÿ–๏ธ Introduce

์• ํ”Œ์˜ iOS ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ Cocoa MVC ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๋“ค์—ˆ๋˜ ๋ง์€ Massive View Controller์˜€๋‹ค.

๊ทธ ๋‹น์‹œ ๋””์ž์ธํŒจํ„ด์— ๋Œ€ํ•œ ๊ฒฌํ•ด๊ฐ€ ๋„“์ง€ ์•Š์•„ ๊ตณ์ด ๊ตฌ์‹? ๋””์ž์ธ ํŒจํ„ด์„ ๊ณต๋ถ€ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‚˜ ์‹ถ์—ˆ๋˜ ํ•„์ž๋Š” Cocoa MVC๋ฅผ ์ƒํ˜ธ ์šด์šฉํ•  ์ˆ˜ ์žˆ๋Š” MVVM ํŒจํ„ด์„ ๋จผ์ € ์ตํ˜”๊ณ  ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด์™”๋‹ค.(๋ฌผ๋ก  MVVM๋„ ์จ๋ณด๊ธฐ๋งŒ ํ–ˆ์ง€ ๊นŠ๊ฒŒ๋Š” ๋ชจ๋ฆ„..)

ํ•˜์ง€๋งŒ Cocoa MVC๋Š” ์—„์—ฐํžˆ Apple์ด iOS ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ฑ„ํƒํ•œ ๋””์ž์ธ ํŒจํ„ด์ธ๋‹ค.(Apple๋„ Massive View Controller๋ฅผ ์ธ์ •ํ•˜๊ธด ํ•จ..)
๋”ฐ๋ผ์„œ ํ•ด๋‹น ์„น์…˜์„ ํ†ตํ•ด iOS ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ธ Cocoa MVC ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•œ ๊ฒฌ๋ฌธ์„ ๋„“ํžˆ๊ณ , ์•ž์œผ๋กœ ํ•„์ž์˜ ๊ฐœ๋ฐœ ์ธ์ƒ์—์„œ Cocoa MVC๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๋ช…๋ฐฑํ•œ ์ด์œ ๋ฅผ ์ˆ˜๋ฆฝํ•˜๊ณ ์ž ์ž‘์„ฑํ•œ๋‹ค.

๐ŸŒฑ MVC ๊ฐ์ฒด์˜ 3๊ฐ€์ง€ ํƒ€์ž…๊ณผ ์—ฐ๊ด€๊ด€๊ณ„

Cocoa MVC ํŒจํ„ด์„ ์•Œ์•„๋ณด๊ธฐ ์•ž์„œ MVC ๋””์ž์ธ ํŒจํ„ด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ์ฒด ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•œ๋‹ค.
MVC ๋””์ž์ธ ํŒจํ„ด์€ ์ด 3๊ฐœ์˜ ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์ข…๋ฅ˜๋กœ๋Š” Model, View, Controller ์„ธ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.
์„ธ ๊ฐ€์ง€ ๊ฐ์ฒด๋Š” ๊ฐ๊ฐ ์ถ”์ƒ์  ๊ฒฝ๊ณ„๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•œ๋‹ค.

Model

Model ๊ฐ์ฒด๋ฅผ ํ•œ ๋งˆ๋””๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด โ€œ์•ฑ์˜ ์•„์ดํ…ํ‹ฐํ‹ฐโ€์ด๋‹ค.

  • Model ๊ฐ์ฒด์—๋Š” Data ๋˜๋Š” DB์— ์œ„์น˜ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ Requestํ•˜๊ธฐ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋กœ์ง์ด ๋‹ด๊ธฐ๋ฉฐ, MVC ๊ธฐ๋ฐ˜์œผ๋กœ ์ž˜ ์„ค๊ณ„๋œ App์€ ๋ชจ๋“  Data๋ฅผ Model ๊ฐ์ฒด์— ์บก์Аํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Model ๊ฐ์ฒด๋Š” Data๋ฅผ ํ™œ์šฉํ•ด App์—์„œ ์ œ๊ณตํ•˜๊ณ ์ž ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)์ด ๋‹ด๋ฉฐ, ํŠน์ • ๋„๋ฉ”์ธ์— ๊ด€๋ จ๋œ Data๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์žฌ์‚ฌ์šฉ์„ฑ์ด ํ™•๋ณด๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.
  • Model์€ Interface๋‚˜ Presentation ๊ณ„์ธต์— ์†ํ•œ ๊ฐ์ฒด์™€๋Š” ๋ช…์‹œ์ ์ธ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ฑ๋ฆฝํ•  ์ˆ˜ ์—†๋‹ค.

View

View ๊ฐ์ฒด๋Š” Model ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ(Data)๋ฅผ ์–ด๋–ป๊ฒŒ Interface์— ํ‘œํ˜„ํ• ์ง€ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ธด๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ Model ๊ฐ์ฒด์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” Data ๊ฐ’์„ View ๊ฐ์ฒด์—์„œ ์•Œ์•„์•ผ ํ•  ๋ช…๋ถ„์ด ํ•„์š”ํ•˜๋‹ค.
ํ•˜์ง€๋งŒ Model ๊ฐ์ฒด๊ฐ€ ํŠน์ • View ๊ฐ์ฒด์™€ ์ง์ ‘์ ์ธ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, Model ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ View ๊ฐ์ฒด์— ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์ด View ๊ฐ์ฒด์— ํ•„์š”ํ•˜๋‹ค.

  • View ๊ฐ์ฒด๋Š” Data๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์—†์–ด์•ผํ•˜๋ฉฐ, ์ด๋Š” Model ๊ฐ์ฒด์™€ ๋ช…์‹œ์ ์ธ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ฑ๋ฆฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.
  • View ๊ฐ์ฒด๋Š” ์žฌ์‚ฌ์šฉ์„ฑ์ด ํ™•๋ณด๋œ๋‹ค.
    • Cocoa์—์„œ UIKit ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ๋งŽ์€ View ๊ฐ์ฒด๋“ค์„ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ Interface Builder ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ œ๊ณตํ•œ๋‹ค.
    • UIKit์˜ View ๊ฐ์ฒด๋“ค์„ ์žฌ์‚ฌ์šฉํ•˜๋ฏ€๋กœ์จ, ๋ชจ๋“  Cocoa App์—์„œ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋†’์€ ์ˆ˜์ค€์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

Controller

Controller ๊ฐ์ฒด๋ฅผ ํ•œ ๋‹จ์–ด๋กœ ํ‘œํ˜„ํ•˜๋ฉด โ€˜์ค‘์žฌ์žโ€™์ด๋‹ค.

Controller ๊ฐ์ฒด๋Š” View ๊ฐ์ฒด๊ฐ€ Model ๊ฐ์ฒด์— ์ ‘๊ทผ(?)ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์ฆํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, View ๊ฐ์ฒด๊ฐ€ Model ๊ฐ์ฒด์˜ Data ๋ณ€ํ™”๋ฅผ ์ธ์ง€ํ•˜๋Š” ํ†ต๋กœ ์—ญํ• ์„ ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ Cocoa MVC ํŒจํ„ด์€ View ๊ฐ์ฒด์—์„œ ๋ฐœ์ƒํ•œ User Action์ด ํ•ด๋‹น Event๋ฅผ ๋ฐฉ์ถœํ•˜๊ณ  ์ด๋ฅผ Controller ๊ฐ์ฒด์— ์ „๋‹ฌํ•œ๋‹ค. Controller ๊ฐ์ฒด๋Š” ํ•ด๋‹น Event๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Model ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Data๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๋ช…๋ นํ•œ๋‹ค.
ํ•ด๋‹น ๋ช…๋ น์„ ํ†ตํ•ด Model ๊ฐ์ฒด์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉฐ, ๋ณ€๊ฒฝ ๋œ Data๋ฅผ User์—๊ฒŒ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด, Model ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ Controller ๊ฐ์ฒด์— ์ „๋‹ฌํ•œ๋‹ค.
Model๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ๋œ Data ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ Controller ๊ฐ์ฒด๋Š” ๋‹ค์‹œ View ๊ฐ์ฒด์— ์ „๋‹ฌํ•˜๋ฏ€๋กœ์„œ User์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” Interface๊ฐ€ ์ˆ˜์ •๋˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์„ ๊ฐ–๋Š”๋‹ค.

Controller ๊ฐ์ฒด๋Š” App์˜ ์ „๋ฐ˜์ ์ธ Set-up์ด๋‚˜ ๊ฐ์ฒด์˜ Life Cycle์„ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


๐ŸŒฑ Cocoa Controller (Objective-C ๊ณต๋ฌธ ์ฐธ์กฐ.. ์˜›๋‚ ๊บผ๋ผ ์ •ํ™•ํ•œ์ง€ ํ™•์‹  ์—†์Œ)

Cocoa Framework์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜(Mediating, Coordinating)์˜ Controller ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค.
๊ฐ ์ข…๋ฅ˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ Class ๋“ค๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ”์œ„์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

Mediating Controller

Mediating Controller๋Š” NSController๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋กœ Cocoa Bindings ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋˜๋ฉฐ, Interface Builder ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์ด๋‹ค.
์‚ฌ์šฉ์ž๋Š” View ํ”„๋กœํผํ‹ฐ์™€ Controller ํ”„๋กœํผํ‹ฐ๊ฐ„ ๋˜๋Š” Controller ํ”„๋กœํผํ‹ฐ์™€ Model์˜ ํŠน์ • ํ”„๋กœํผํ‹ฐ๊ฐ„ ๋ฐ”์ธ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ Mediating Controller๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ User๊ฐ€ View์— ์žˆ๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ, ์ƒˆ๋กœ์šด ๊ฐ’์ด Mediating Controller๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ Model์— ์ „๋‹ฌ๋œ๋‹ค.

Coordinating Controller

Coordinating Controller๋Š” ์ „ํ˜•์ ์œผ๋กœ NSWindowController๋‚˜ NSDocumentController, ํ˜น์€ ์ปค์Šคํ…€์„ ์œ„ํ•ด NSObject๋ฅผ ์ƒ์†ํ•œ SubClass ์ธ์Šคํ„ด์Šค๋‹ค.
App์—์„œ Coordinating Controller์˜ ์—ญํ• ์€ App์˜ ๊ธฐ๋Šฅ์„ฑ์„ ๊ฐ๋…/์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
Coordianting Controller๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  1. Delegate ๋ฉ”์„ธ์ง€์— ์‘๋‹ต
  2. Notification ๊ฐ์ง€
  3. Action ๋ฉ”์„ธ์ง€ ์‘๋‹ต
  4. ์†Œ์œ ํ•œ ๊ฐ์ œ์˜ Life Cycle ๊ด€๋ฆฌ
  5. ๊ฐ์ฒด ๊ฐ„ ์—ฐ๊ฒฐ์  ๋งŒ๋“ค๊ธฐ

Mediating + Coordinating Controller

NSObject๋ฅผ ์ƒ์†๋ฐ›์•„ ์ปค์Šคํ…€ํ•œ SubClass์˜ ์ธ์Šคํ„ด์Šค๋Š” Coordinating Controller๋กœ ์ ํ•ฉํ•˜๋‹ค.
์ด๋Ÿฐ ์ข…๋ฅ˜์˜ Controller๊ฐ์ฒด๋Š” Mediating + Coordinating ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•œ๋‹ค.
Midiating ๊ธฐ๋Šฅ์„ ์œ„ํ•ด View์™€ Model๊ฐ„ Data ์ด๋™ ๊ตฌํ˜„์— Target-action/outlets/delegation ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” Glue Code๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด Code๋Š” ๋…์ ์ ์œผ๋กœ App-specificํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์žฅ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ ์€ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด์ด๋‹ค.

(์ด๊ฒŒ UIViewController ๊ฐ™์€๋ฐ ๋งž๋‚˜???)


ยฉ 2024. All rights reserved.

Powered by Hydejack v9.2.1