Search
Duplicate

MVVM-C ํŒจํ„ด

์ƒ์„ฑ์ผ
2023/12/06 12:54
ํƒœ๊ทธ
Pattern

ย MVVM-C ํŒจํ„ด

MVVM-C ํŒจํ„ด์€ iOS ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ MVVM ๊ณผ Coordinator ๋ฅผ ๊ฒฐํ•ฉํ•œ ํ˜•ํƒœ์ด๋‹ค.
์ด ํŒจํ„ด์€ ์•ฑ์˜ ๊ตฌ์กฐ๋ฅผ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋ฉฐ, ํŠนํžˆ ํฐ ํ”„๋กœ์ ํŠธ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

ย MVVM-C ๊ตฌ์„ฑ์š”์†Œ

Model

โ€ข
๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•œ๋‹ค.
โ€ข
์•ฑ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จํ•œ๋‹ค.

View

โ€ข
์‚ฌ์šฉ์ž์˜ ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
โ€ข
์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ์š”์†Œ๋“ค(๋ฒ„ํŠผ, ํ…์ŠคํŠธ๋ทฐ ๋“ฑ)์ด ์ด๊ณณ์— ํฌํ•จ๋œ๋‹ค.

ViewModel

โ€ข
View์™€ Model ์‚ฌ์ด์˜ โ€˜์ค‘๊ฐœ์žโ€™ ์—ญํ• ์„ ํ•œ๋‹ค.
โ€ข
View์— ํ‘œ์‹œ๋  ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์•ก์…˜์— ๋”ฐ๋ผ Model์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
โ€ข
ViewModel์€ View์˜ ์ƒํƒœ์™€ ๋กœ์ง์„ ๊ฐ€์ง€์ง€๋งŒ, ์ง์ ‘์ ์œผ๋กœ View๋ฅผ ์ฐธ์กฐํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

Coordinator

โ€ข
์•ฑ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜๊ณผ ํ™”๋ฉด ์ „ํ™˜์„ ๋‹ด๋‹นํ•œ๋‹ค. ๊ฐ ํ™”๋ฉด(๋ทฐ)์— ๋Œ€ํ•œ ์ด๋™ ๋กœ์ง๊ณผ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜์—ฌ,
โ€ข
View์™€ ViewModel์ด ๋„ค๋น„๊ฒŒ์ด์…˜์— ๊ด€๋ จ๋œ ๋กœ์ง์„ ๊ฐ€์ง€์ง€ ์•Š๋„๋ก ๋„์™€์ค€๋‹ค.

ย MVVM-C ํŒจํ„ด์˜ ์žฅ์ 

๋ถ„๋ฆฌ๋œ ๊ด€์‹ฌ์‚ฌ

โ€ข
๊ฐ ์ปดํฌ๋„ŒํŠธ(๋ชจ๋ธ, ๋ทฐ, ๋ทฐ๋ชจ๋ธ, ์ฝ”๋””๋„ค์ดํ„ฐ)๋Š” ์ž์‹ ์˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค.

์žฌ์‚ฌ์šฉ์„ฑ ๋ฐ ํ™•์žฅ์„ฑ

โ€ข
์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๋‹ค.

ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ

โ€ข
ViewModel์€ View์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, UI์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๋‹ค.

๋„ค๋น„๊ฒŒ์ด์…˜ ๊ด€๋ฆฌ

โ€ข
Coordinator๋ฅผ ํ†ตํ•ด ๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ, ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์œ ์—ฐํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

ย MVVM-C ํŒจํ„ด์˜ ๋‹จ์ 

๋ณต์žก์„ฑ

โ€ข
๋‹จ์ˆœํ•œ ์•ฑ์— ๋Œ€ํ•ด์„  ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด์˜ ๋„์ž…์œผ๋กœ ์ธํ•ด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•™์Šต ๊ณก์„ 

โ€ข
์ด ํŒจํ„ด์„ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ํ•™์Šต ๊ณก์„ ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด MVVM-C์— Clean Architecture๋ฅผ ๋„์ž…ํ•˜๋Š”๊ฑด ๊ดœ์ฐฎ์„๊นŒ?

ย MVVM-C์™€ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฐํ•ฉ ์ด์ 

๊ฐ•ํ™”๋œ ๋ถ„๋ฆฌ ๋ฐ ์ถ”์ƒํ™”

โ€ข
ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๊ณ„์ธต์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค.
โ€ข
์ด๋Š” MVVM-C์˜ ๊ตฌ์„ฑ์š”์†Œ์™€ ์ž˜ ์–ด์šธ๋ ค, ์ฝ”๋“œ์˜ ์˜์กด์„ฑ์„ ๋”์šฑ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ

โ€ข
ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘์‹œํ•œ๋‹ค.
โ€ข
MVVM-C์—์„œ ViewModel์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ, ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋ชจ๋“  ๊ณ„์ธต์—์„œ์˜ ๋…๋ฆฝ์ ์ธ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์œ ์—ฐํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ด€๋ฆฌ

โ€ข
MVVM-C์—์„œ Coordinator๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ ๊ด€๋ฆฌํ•œ๋‹ค.
โ€ข
ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์šฉํ•˜๋ฉด, ์ด๋Ÿฌํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ด€๋ฆฌ๊ฐ€ ๋”์šฑ ์ฒด๊ณ„์ ์ด๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ ํ–ฅ์ƒ

โ€ข
ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
โ€ข
๊ฐ ๊ณ„์ธต์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ๊ณ„์ธต์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.

๊ธฐ์ˆ ์  ๋ถ€์ฑ„ ๊ฐ์†Œ

โ€ข
์žฅ๊ธฐ์ ์ธ ๊ด€์ ์—์„œ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜๋ฉด ๊ธฐ์ˆ ์  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ณ , ๋” ๊ฑด๊ฐ•ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผํ• ์ 

โ€ข
๋ณต์žก์„ฑ
โ—ฆ
ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๋ณต์žกํ•˜๋ฉฐ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์—๋Š” ๊ตฌ์ถ•์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
โ—ฆ
์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
โ€ข
ํ•™์Šต ๊ณก์„ 
โ—ฆ
ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ์›์น™๊ณผ ํŒจํ„ด์„ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ํŒ€์› ๋ชจ๋‘๊ฐ€ ์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜์— ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•œ๋‹ค.

ย MVVM-C + Clean Architecture ๊ธฐ๋ณธ ํด๋” ๊ตฌ์กฐ

YourApp โ”‚ โ”œโ”€โ”€ Application โ”‚ โ”œโ”€โ”€ AppDelegate.swift โ”‚ โ”œโ”€โ”€ SceneDelegate.swift โ”‚ โ”œโ”€โ”€ Core โ”‚ โ”œโ”€โ”€ Extensions โ”‚ โ”œโ”€โ”€ Utilities โ”‚ โ””โ”€โ”€ Constants โ”‚ โ”œโ”€โ”€ Data โ”‚ โ”œโ”€โ”€ Repositories โ”‚ โ”œโ”€โ”€ Services โ”‚ โ””โ”€โ”€ Models โ”‚ โ”œโ”€โ”€ Domain โ”‚ โ”œโ”€โ”€ Entities โ”‚ โ”œโ”€โ”€ UseCases โ”‚ โ””โ”€โ”€ Protocols โ”‚ โ”œโ”€โ”€ Presentation โ”‚ โ”œโ”€โ”€ Views โ”‚ โ”‚ โ”œโ”€โ”€ ViewControllers โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ [ViewControllerName]ViewController.swift โ”‚ โ”‚ โ”œโ”€โ”€ Views โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ [CustomViewName].swift โ”‚ โ”‚ โ””โ”€โ”€ Cells โ”‚ โ”‚ โ””โ”€โ”€ [CustomCellName].swift โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ViewModels โ”‚ โ”‚ โ””โ”€โ”€ [ViewModelName].swift โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ Coordinators โ”‚ โ””โ”€โ”€ [CoordinatorName].swift โ”‚ โ””โ”€โ”€ SupportingFiles โ”œโ”€โ”€ Info.plist โ””โ”€โ”€ Assets.xcassets
Shell
๋ณต์‚ฌ

Core

โ€ข
์ „์ฒด ์•ฑ์• ์„œ ์‚ฌ์šฉ๋˜๋Š” ํ™•์žฅ, ์œ ํ‹ธ๋ฆฌํ‹ฐ, ์ƒ์ˆ˜ ๋“ฑ์„ ํฌํ•จํ•œ๋‹ค.

Data

โ€ข
๋ฐ์ดํ„ฐ ๊ณ„์ธต๊ณผ ๊ด€๋ จ๋œ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ๋‹ค.
โ€ข
๋ ˆํผ์ง€ํ† ๋ฆฌ, ์„œ๋น„์Šค, ๋ชจ๋ธ ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.

Domain

โ€ข
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๋ จ๋œ ์—”ํ‹ฐํ‹ฐ, ์œ ์ฆˆ์ผ€์ด์Šค, ํ”„๋กœํ† ์ฝœ ๋“ฑ์„ ํฌํ•จํ•œ๋‹ค.

Presentation

โ€ข
UI์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•œ๋‹ค.
โ€ข
Views
โ—ฆ
ViewController, Views, Cells
โ€ข
ViewModels
โ—ฆ
๊ฐ ๋ทฐ์˜ ๋ทฐ๋ชจ๋ธ์„ ํฌํ•จํ•œ๋‹ค.
โ€ข
Coordinator
โ—ฆ
์•ฑ์˜ ํ™”๋ฉด ์ „ํ™˜๊ณผ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ๋“ค์„ ํฌํ•จํ•œ๋‹ค.

SupportingFiles

โ€ข
Info.plist, Assets.xcassets ๋“ฑ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ํŒŒ์ผ๋“ค์„ ํฌํ•จํ•œ๋‹ค.

ย ์ •๋ฆฌ

MVVM-C ํŒจํ„ด์€ iOS ๊ฐœ๋ฐœ์—์„œ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•œ ์•ฑ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋งค์šฐ ํšจ๊ณผ์ ์ธ ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
๋˜ํ•œ MVVM-C ํŒจํ„ด์— ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ, ํŒ€์˜ ๊ฒฝํ—˜, ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
์ž˜ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ, ์ด ์กฐํ•ฉ์€ ์•ฑ์˜ ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋‚˜ ํŒ€์˜ ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ํŒจํ„ด์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

ย ๋‚˜์˜ ์ƒ๊ฐ

์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ - MVC, MVP
์ค‘์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ - MVVM
์ค‘๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ - MVVM + Clean Architecture
๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ - MVVM-C + Clean Architecture
ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ์ƒ๊ด€์—†์ด ์œ ์—ฐ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ์ค‘์‹œํ•˜๋Š” ๊ฒฝ์šฐ, ๋น„๊ต์  ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋„ MVVM์ด๋‚˜ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ๋‹ค!