์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- XCTest
- ๋ฐฑ์ค
- BFS
- visionOS
- Xcode
- node.js
- RxSwift
- UIKit
- BOJ
- ios
- Lv2
- realm
- rxcocoa
- ํจ์คํธ์บ ํผ์ค
- Flutter
- SnapKit
- Kuring
- tableView
- swift
- MVVM
- raywenderlich
- SwiftUI
- combine
- ํ๋ก๊ทธ๋๋จธ์ค
- designpattern
- arkit
- TCA
- Swfit
- reactorkit
- CollectionView
- Today
- Total
lgvv98
[Swift] MVC Pattern ๋ณธ๋ฌธ
MVC Pattern
โ MVC Pattern
(์ฐธ๊ณ ) ์๋์ ๊ธ์ ์ง์ ํด์ํ๊ณ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ์์ฑํ์์ต๋๋ค. (์ค์ญ์ด ์์ ์๋ ์์ต๋๋ค.)
โ MVC๋?
๐ Model : ๋ฐ์ดํฐ๊ฐ ์๋ ๊ณณ์ผ๋ก ์ง์์ ์ธ ๋ฐ์ดํฐ, ๋ชจ๋ธ ์ค๋ธ์ ํธ, ๋ฐ์ดํฐ parser, ๋งค๋์ ๋ค, ๋คํธ์ํน ์ฝ๋๋ค์ด ์ด๊ณณ์ ์์นํฉ๋๋ค.
-> ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์กฐ์ฒด๋ ๋จ์ ํด๋์ค์ด๋ค.
๐ View : ์ฑ์์ ์ ์ ์๊ฒ ๋ณด์ด๋ ๊ณ์ธต์ ๋๋ค. ๋น์ง๋์ค ๋ก์ง์ ํฌํจํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ ๋ ์๋ ์์ต๋๋ค.
-> ํ๋ฉด์ ์๊ฐ์ ์์์ ์ปจํธ๋กค์ ํ์ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก UIView์ ํ์ ํด๋์ค์ด๋ค.
๐ Controller : delegation Pattern์ ํตํด์ view์ Model ์ฌ์ด๋ฅผ ์ค์ฌํ๋ค. ์ด์์ ์ธ ์๋๋ฆฌ์ค์์๋ Controller entity๋ ๊ตฌ์ฒด์ ์ผ๋ก view์ ๋ํด์ ์์ง ๋ชปํ๋ค. ๋์ ์ protocol์ ํตํด์ ์ถ์ํํ์ฌ view์ ์ํตํ๋ค.
(๊ฐ์ฅ ์ ํ์ ์ธ ์์ ๋ก๋ UITableView์์ UITableViewDataSource๋ฅผ ํตํด์ ์ํตํ๋ค.)
-> ์ผ๋ฐ์ ์ผ๋ก UIViewController์ ํ์ ํด๋์ค์ด๋ค.
MVC ํจํด์ ์ ํ์ด UIKit์์ ์ฑํํ๊ธฐ๋ก ํ ๋์์ธ ํจํด์ด๋ผ iOSํ๋ก๊ทธ๋๋ฐ์์ ์ผ๋ฐ์ ์ด๋ค.
์ปจํธ๋กค๋ฌ๋ค์ ๊ทธ๋ค์ ๋ชจ๋ธ๊ณผ ๋ทฐ์ strong propertis๋ฅผ ๊ฐ๋๊ฒ์ ํ์ฉํ ์ ์์ด์, ์ง์ ์ ๊ทผํ ์๋ ์๋ค. ์ปจํธ๋กค๋ฌ๋ค์ ๋ ์ด์์ model๊ณผ view๋ฅผ ๊ฐ๊ณ ์์์๋ ์๋ค.
๋ฐ๋๋ก! ๋ชจ๋ธ๊ณผ ๋ทฐ๋ ์์ ์ ์ปจํธ๋กค๋ฌ์ ๋ํด์ strong reference(๊ฐํ ์ฐธ์กฐ)๋ฅผ ํ๋ฉด ์๋๋ค. ์ด๊ฒ์ retain cycle์ ์ผ๊ธฐํ๋ค.
๋์ ์ models์ properties๋ฅผ observingํ์ฌ ์ํตํ๋ฉฐ, view๋ IBActions์ ํตํด ํต์ ํ๋ค.
์ด๋ฅผ ํตํด models๊ณผ views๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
(์ฐธ๊ณ ) ๋ทฐ๋ ์์ ์ ์์ ํ๊ณ ์๋ ์ปจํธ๋กค๋ฌ์ ๋ํด์ delegate๋ฅผ ํตํด weak reference๋ฅผ ๋ค๊ณ ์์ ์ ์๋ค. (delegation pattern์ ํตํด ํ์ธํ ์ ์๋ค.) ์๋ฅผ ๋ค๋ฉด UITableView์ ๊ฒฝ์ฐ์๋ weak reference๋ฅผ ํตํด์ delegate์ dataSource๋ก ๋ค๊ณ ์์ ์ ์๋ค. ํ์ง๋ง ํ ์ด๋ธ ๋ทฐ๋ ์์ ์ ์ปจํธ๋กค๋ฌ์ ๋ํด์ ์์ง ๋ชปํฉ๋๋ค.
โ When should you use it?
iOS ์ฑ ์์ฑ์ ์์์ ์ผ๋ก ์ด์ฉํ์!!
๊ฑฐ์ ๋ชจ๋ ์ฑ์์ MVC์ธ์ ๋ค๋ฅธ ํจํด๋ค์ด ํ์ํ ์ ์์ด์ ๋ค๋ฅธ ํจํด์ ์ถ๊ฐํด๋ ๋๋ค.
โ Playground example
์๋๋ ์ฝ๋์ด๋ค.
MVCํจํด์ ์ ๋ง ๋ํ์ ์ธ ํจํด์ด๋ผ ํน๋ณํ ์ด๋ ค์ด ์ ์ ์์๋ค.
https://github.com/lgvv/DesignPattern/tree/main/model-view-controller-pattern/RabbleWabble
์์ ํ์ผ์ ๋ํ Class Diagram
(์ถ๊ฐ์๋ฃ)
์๋๋ raywenderlich์ ๋ค๋ฅธ ๊ธ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค.
https://www.raywenderlich.com/1000705-model-view-controller-mvc-in-ios-a-modern-approach
MVC๋ฅผ ์ ๋ ๊นจ์๋ ์๋๋ ์๊ฒฉํ ๊ท์น์ผ๋ก ์ ๊ทผํ๋๊ฒ ์๋๋ผ, ํ๋์ ํจํด์ผ๋ก์ ์ทจ๊ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ณต๋ถํ์.
โ The Model(M)
๋ชจ๋ธ์ ์ฑ์ ๋ฐ์ดํฐ๋ค์ ํฌ๊ดํ๊ณ ์์ผ๋ฉฐ, ๋ค๋ฅธ ํด๋์ค๋ ํ๋ก์ ํธ์ ๊ฐ์ฒด๋ ๋ชจ๋ธ์์ ํฌํจํ ์ ์๋ค.
- Network Code : ๋คํธ์ํฌ ํต์ ์ ๋จ์ผ ํด๋์ค์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, HTTP ํค๋, ์๋ต ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ ๋ชจ๋ ๋คํธ์ํน ์์ฒญ์ ๊ณตํต๋๋ ๊ฐ๋ ์ ์ถ์ํํ ์ ์๋๋ก ํจ
- Persistence Code : ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ฝ์ด ๋ฐ์ดํฐ, ๋๋ฐ์ด์ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ฌ์ฉํ์
- Parsing Code : ๋คํธ์ํฌ ์๋ต์ ๋ํด์ parsingํ๋ ๊ฒ์ ๋ชจ๋ธ์ ํฌํจํ์. JSON ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ์ ํตํด ํ์ฑ์ ์ฒ๋ฆฌํ๋ค. ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ ๋ชจ๋ธ ๊ฐ์ฒด์ ์ธ๋ถ์ฌํญ์ ์ ํ์๊ฐ ์์ด์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ parsing์ ๋ชจ๋ธ์์ ์ฒ๋ฆฌํฉ๋๋ค.
- Managers and abstraction layers/classes : ๋ชจ๋๊ฐ ์ฌ์ฉํ๊ณ , ํ์๋กํ๋ฉฐ ๊ทธ๋ฌ๋ ๊ทธ ๋๊ตฌ๋ ๋ฌด์์ด๋ผ๊ณ ๋ถ๋ฌ์ผํ ์ง ๋ชจ๋ฆ ๋๋ค. Mangers๊ฐ ๋ค๋ฅธ ํด๋์ค๊ฐ์ ์ ์ฐฉ์ ์ญํ ์ ํ๊ธฐ๋ ํฉ๋๋ค. ๋ํ ํ์ ์์ค์ ๋ํํ์ฌ iOS ํค์ฒด์ธ, HealthKit๊ณผ ํจ๊ป ์์ ํ ์๋ ์์ต๋๋ค.
- Data sources and delegates : ๋ชจ๋ธ ๊ฐ์ฒด์ ์์กดํ๋ ๊ฒ์ด ๊ฐ๋ฐ์๋ค์๊ฒ ๋ ํํ ๋ฐฉ๋ฒ์ด๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ๋ชจ๋ธ์์ ์ฒ๋ฆฌํ์๊ณ ์ด์ผ๊ธฐ๋ฅผ ํ์์ผ๋, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ๊ฐ๋ฐ์๋ค์ ์ปจํธ๋กค๋ฌ์์ ๊ตฌํํฉ๋๋ค.
- Constants : ์์๋ฅผ ๋ชจ๋ธ์ ๊ฐ์ง๋ฉด ์คํ ๋ฆฌ๋ณด๋ ์ด๋ฆ, ๋ ์ง ํฌ๋งทํฐ, ์์ ๋ฑ์ ์ฌ์ฌ์ฉ ํ ์ ์๋ค.
- Helpers and extensions : ํ๋ก์ ํธ์์ ๋ฌธ์์ด ๋ชจ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๋ ์ด ์ญ์ ๋ชจ๋ธ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ค.
ํฌํจํ ์ ์๋ ๋ ๋ง์ ์ผ์ด์ค๊ฐ ์์ง๋ง, ์์ ๊ฒ๋ค์ด ๊ฐ์ฅ ํํ ์์์ด๋ค.
ํ ์คํธ ๊ด์ ์์ ๋ชจ๋ธ์ ๊ฐ์ฅ ์ข์ ํ๋ณด์ธ๋ฐ, ๋น์ฆ๋์ค ๋ก์ง, ๋คํธ์ํน, persistence ๋ฉ์๋ ๋ฑ์ ์ค์ํ ๋ถ๋ถ์ ์ค์ฌ์ผ๋ก ํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
โ The View(V)
์ฌ์ฉ์๊ฐ ์ฑ๊ณผ ์ํธ ์์ฉํ ๋ ์ธํฐ๋ํ ํ๋ ๋ถ๋ถ์ด๋ค. ์ด๋ ํ ๋น์ฆ๋์ค ๋ก์ง๋ ํฌํจ๋๋ฉด ์๋๋ค.
์ผ๋ฐ์ ์ผ๋ก View์์ code smell์ด ์ฌ๋ฌ ํํ๋ก ๋ฐ๊ฒฌ๋๋ค. UI๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด, ๋คํธ์ํฌ๋ ๋น์ฆ๋์ค ๋ก์ง ๋ชจ๋ธ์ ์กฐ์ ํ๋ ๋ฑ์ด ๋ํ๋๋๋ฐ ๊ทธ๋ ์ง ์๋๋ก ์ฃผ์ํ์.
View๋ฅผ ๊ตฌ์ฑํ๋๋ฐ ์ฒดํฌ๋ฆฌ์คํธ๋ก ์ฌ์ฉํ์. ( ๋ชจ๋ no๋ก ๋๋ตํ ์ ์๋๋ก )
- ๋ชจ๋ธ ๋ ์ด์ด์ ์ํตํ๊ณ ์๋๊ฐ?
- ๋น์ง๋์ค ๋ก์ง์ ํฌํจํ์๋๊ฐ?
- UI์ ๊ด๋ จํ์ง ์์ ๊ฒ๋ค์ด ์๋๊ฐ?
โ The Controller(C)
์ปจํธ๋กค๋ฌ๋ domain-specific rules์ ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ์ฑ์์ ๊ฑฐ์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋ ๋์์ ๊ฒฐ์ ํ๋ ๊ฒ๋ค์ controller๋ก ๋ณผ ์ ์๋ค.
- ์ง์์ฑ ๋๋ ๋คํธ์ํฌ ์ค ์ด๋ค๊ฒ์ ๋จผ์ ์์ธ์ค ํด์ผ ํ๋๊ฐ?
- ์ผ๋ง๋ ์์ฃผ ์ฑ์ ์๋ก๊ณ ์นจ ํด์ผ ํ ๊น?
- ๋ค์ ํ๋ฉด์ ์ด๋ค ์ํฉ์ด์ด์ผ ํ ๊น?
- ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๊ฐ๋ฉด ๋ญ ์ ๋ฆฌํด์ผ ํ ๊น?
- ์ฌ์ฉ์๊ฐ ์ ์ ๋๋ ๋๋ฐ ๋ค์์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์ปจํธ๋กค๋ฌ ๊ณ์ธต์ ์ฑ์ ๋๋ ๋๋ ์์ง์ผ๋ก ์๊ฐํ๋ฉฐ, ๋ค์์ ์ด๋ค ์ผ์ด ์ผ์ด๋ ์ง ๊ฒฐ์ ํ์.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ ๊ณ์ธต์์ ์์ ์์, ๋ฐ์ดํฐ ๋ก๋ ํธ๋ฆฌ๊ฑฐ, UI ์ํธ ์์ฉ ์ฒ๋ฆฌ, UI์ ๋ชจ๋ธ ์ฌ์ด์ ๋ฐ์ดํฐ ์กฐ์ ๋๋ฌธ์ ํ ์คํธ๋ฅผ ์ํํ์ง ์์ ์๋ ์๋ค.
(์ฐธ๊ณ )
์ ํ์ MVC ํจํด์ ๋ํ ๋ฌธ์
delegation pattern
2022.04.10 - [iOS/DesignPattern] - [Swift] Delegation Pattern
'apple > ๐ก DesignPattern & Architecture' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Observer Pattern (0) | 2022.04.19 |
---|---|
[Swift] Memento Pattern (0) | 2022.04.13 |
[Swift] Strategy Pattern (0) | 2022.04.11 |
[Swift] Delegation Pattern (0) | 2022.04.10 |
[Swift] Class Diagram + ์คํฐ๋ (0) | 2022.04.07 |