์ด ํฌ์คํ ์ 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 |
---|