Deep_Dev
article thumbnail

์ด ํฌ์ŠคํŒ…์€ Udemy "MVVM Design Pattern in iOS Using SwiftUI" ๊ฐ•์˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋œ ๊ฒƒ์ด๋ฉฐ

๋ชจ๋“  ๋‚ด์šฉ์˜ ์ €์ž‘๊ถŒ์€ ๊ฐ•์˜์˜ ์›์ž‘์ž์ธ Mohammad Adam ์—๊ฒŒ ์žˆ์Œ์„ ๋ฐํž™๋‹ˆ๋‹ค.

 

 

โœ… MVVM ํŒจํ„ด์ด๋ž€

Model - View - ViewModel๋กœ ๋‚˜๋‰œ๋‹ค.

ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒƒ์ด MVVM์˜ ํ•ต์‹ฌ์ด๋‹ค.

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ View๊ฐ€ ViewModel ๊ฐ’์„ ๊ด€์ฐฐํ•˜์—ฌ ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ,

๋ฒ„ํŠผ ํด๋ฆญ์„ ํ–ˆ์„ ๋•Œ ๋‹ค์Œ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜ค๋Š” ๋™์ž‘์„ ํ•œ๋‹ค๊ณ  ์นœ๋‹ค.

MVC๋Š” ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ๋ฉด ์ด๋ฏธ์ง€๋ฅผ "๋ฐ”๊พผ๋‹ค"์˜ ๊ฐœ๋…์ด๋ผ๋ฉด,

MVVM์€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ทฐ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋‹ˆ ์ด๋ฏธ์ง€๋„ "์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ”๋€Œ์–ด์ง„๋‹ค"๋Š” ๊ฐœ๋…์ด๋‹ค.

 

๊ทธ๋ž˜์„œ View๊ฐ€ ViewModel์˜ ๊ฐ’์„ ๊ด€์ฐฐํ•œ๋‹ค๋Š” ๋ง์„ ํ•œ ๊ฒƒ์ด๊ณ ,

์ด๋ฅผ ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ Combine, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ RxSwift์ด๋‹ค.

 

โœ… MVVM ์žฅ์ 

- ๋กœ์ง๊ณผ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์ƒ์‚ฐ์„ฑ์ด ๋†’๋‹ค.

- ViewModel์—์„œ View๋ฅผ ๋ชฐ๋ผ๋„ ๋˜๋‹ˆ UI๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•„๋„ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

- ์˜์กด์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆ˜์›”ํ•ด์ง€๊ณ  View์™€ ViewModel์ด 1:N ๊ด€๊ณ„์ด๋ฏ€๋กœ ๋กœ์ง์„ ๋ชจ๋“ˆํ™”ํ•ด์„œ ์—ฌ๋Ÿฌ View์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ… MVVM ๋‹จ์ 

- MVC์— ๋น„ํ•ด ์„ค๊ณ„๊ฐ€ ๋ณต์žกํ•˜๋‹ค.

- ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋ชจ๋ฅด๋ฉด ์•„์˜ˆ ์‹œ๋„์กฐ์ฐจ ํ•  ์ˆ˜ ์—†๋‹ค. ( ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋Š” MVC๊ฐ€ ๋‚˜์„์ˆ˜๋„ )

- ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๋„ ์‹ฌํ•˜๋‹ค.

- ViewModel์— ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ViewModel์ด ๋น„๋Œ€ํ•ด์ง„๋‹ค.

 

โœ… MVVMํŒจํ„ด ์ ์šฉ ์˜ˆ์‹œ

'Increment'๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ˆซ์ž๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ณ , ์˜ฌ๋ผ๊ฐ„ ์ˆซ์ž๊ฐ€ 3์˜ ๋ฐฐ์ˆ˜๊ฐ€ ๋˜๋ฉด ํ™”๋ฉด์— 'Premium'์„ ์ถœ๋ ฅํ•˜๋Š” ์•ฑ์„ MVVMํŒจํ„ด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ž‘์„ฑํ•ด๋ณด์ž.

 

 

โœ… Model ์ฝ”๋“œ

Counter ์ด๋ผ๋Š” Model์ด ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ๊ตฌ์กฐ์ฒด ์•ˆ์— ์ˆซ์ž๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๊ณ  ์ฆ๊ฐ€ํ•œ ์ˆซ์ž์— ๋”ฐ๋ผ Premium์„ ๊ฒฐ์ •ํ•˜๋Š” ๋กœ์ง์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ… ViewModel ์ฝ”๋“œ

'CounterViewModel'์ด๋ผ๋Š” ์ด๋ฆ„์˜ ViewModel์€ ObservableObject๋กœ ์„ ์–ธ๋˜์—ˆ๊ณ , ๊ทธ ์•ˆ์—์„œ Counter Model์„ ๊ฐ€์ ธ์™€์„œ ์„ ์–ธํ•ด์ฃผ์—ˆ์œผ๋ฉฐ ์ด๋Š” @Published๋กœ ์„ ์–ธ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ObservableObject๋ž€ Model์— ์ƒ๊ธด ๋ณ€ํ™”๋ฅผ ์ž๋™์œผ๋กœ View์— ์—…๋ฐ์ดํŠธํ•˜๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด struct๊ฐ€ ์•„๋‹Œ class์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ CounterViewModel์„ class๋กœ ์„ ์–ธํ•ด์ค€๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์–ด๋– ํ•œ event๋กœ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ฐ”๋€๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ @Published๋กœ ์„ ์–ธํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ฐ”๋€ ๊ฐ’์„ View์—์„œ ๋ Œ๋”๋งํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

CounterModel ๊ตฌ์กฐ์ฒด๋ฅผ @Published๋ฅผ ๋ถ™์ธ 'counter'๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์™€์„œ, ๊ฐ์ฒด๋‚ด์—์„œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ”๊ฟ”์ฃผ๊ณ  View์— ๋ฐ”๋€ ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด View์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฐ›์œผ๋ฉด ๋ ๊นŒ ?

 

โœ… View

๊ฐ€์žฅ ๋ˆˆ์—ฌ๊ฒจ ๋ณผ ๊ฒƒ์€ @ObservedObject์ด๋‹ค.

 

@ObservedObject๋Š” ObservableObject์—์„œ Publishedํ•œ ๊ฐ’์„ ๋ฐ›๋Š” ์นœ๊ตฌ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” CounterViewModel๊ฐ์ฒด๋ฅผ @ObservedObject๋กœ ์„ ์–ธํ•จ์— ๋”ฐ๋ผ ViewModel์ด ๋ณ€ํ™”์‹œํ‚จ Model์˜ ๊ฐ’์„ ๋ฐ›์•„์™€ ๋ Œ๋”๋งํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

'counterVM'๋ผ๋Š” ์ด๋ฆ„์˜ ViewModel๊ฐ์ฒด๋ฅผ ํ†ตํ•ด Model๊ณผ ์†Œํ†ตํ•œ๋‹ค๊ณ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

 

View์•ˆ์—์„œ 'counterVM.increment()'ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Model์˜ value๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ ,

counterVM.value ๋ฅผ ํ†ตํ•ด ๊ทธ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋‹ค์‹œ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  counterVM.premium์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋กœ์ง์„ ํ™•์ธํ•˜๊ณ  ๋กœ์ง์— ๋”ฐ๋ผ ํ™”๋ฉด์— Premium์ด๋ผ๋Š” text๋ฅผ ๋„์šธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

โœ… ์ •๋ฆฌ

MVVM ํŒจํ„ด์— ๋Œ€ํ•ด ์ดํ•ดํ•  ๋•Œ View Model์˜ ์—ญํ• ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” Model๊ณผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” View ์‚ฌ์ด์—์„œ ์–ด๋– ํ•œ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด, ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ์ˆ˜์›”ํ•  ๊ฒƒ์ด๋‹ค.

'๐ŸŽ iOS > Design Pattern' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์•„ํ‚คํ…์ฒ˜ํŒจํ„ด][iOS] MVC ํŒจํ„ด  (0) 2023.05.11