์, ์ด์ ์ ๋ง ๊ท์ฐข์ด์ง๊ฒ ๋ค์๋ MVC์ MVVM ํจํด์ ๋ํด์ ํฌ์คํ
ํด๋ณด์.
์ฃผ์ ๋, MVC ํจํด์ MVVMํจํด์ผ๋ก ๋ฐ๊พธ๊ธฐ!!~ ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฐจ์ด์ ์ ๋ํด์ ์ง์ ๋๊ปด๋ณด์
๊ฐ๋ฐํ๋ ์ ๋๋ฆฌ๋์ ์ ํ๋ธ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด์ ํฌ์คํ ์์ฑํฉ๋๋ค.
(https://www.youtube.com/watch?v=TLX7MjtOPd0&t=873)
MVC์ MVVM์ด ๋ญ์ง ๋จผ์ ์ดํด๋ณด๊ณ ๋๋ฃจ๊ฐ์
โซ๏ธ MVC์ด ๋ญ์ง ๊ฐ๋จํ๊ฒ ์ค๋ช ํด๋ณด์.
Model, View, Controller๋ก ๊ตฌ์ฑ๋ ๋์์ธ ํจํด์ด๋ค. ๋ทฐ๋ฅผ ์์ฑํ๊ณ ๊ด๋ จํ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ด๋ จํ ๊ฒ๋ค์ Controller๊ฐ ๋งก๋๋ค. ๊ฐ ํ๋ก์ธ์ค๋ณ๋ก ๊ตฌ๋ณ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ๊ตฌ์ฑ ์์์๋ง ์ง์คํด์ ๊ฐ๋ฐํ ์ ์๋ค๋ ๊ฒ์ด ์ฅ์ ์ด๋ค. Controller์์ ์์ฑ๋ ์ด๋ฒคํธ๋ค์ ๊ฐฑ์ ํด์ View๋ก ๋ณด์ฌ์ค๋ค. View์์๋ ๋ทฐ๋ฅผ ๋ณด์ฌ์ค ๋ฟ๋ง ์๋๋ผ ์ ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์๋ค์ด๊ณ , ์ด ๋ฐ์๋ค์ฌ์ง ์ด๋ฒคํธ๋ ๋ controller๊ฐ ์ฒ๋ฆฌํ๋ค. Model์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ์ธ DB, ์์, ๋ณ์๋ฑ์ ๋ปํ๋ค. ์ด ๊ฐ๋ค์ ๋ณํ๊ฐ ์๊ธฐ๋ฉด, controller์๊ฒ ์๋ ค์ฃผ๊ณ , Controller๊ฐ ์ด๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํด์ค๋ค.
์ด๋ ๊ฒ Controller๋ฅผ ์ค์ฌ์ผ๋ก ์ธ ๊ฐ๊ฐ ์ํธ์์ฉ์ ํตํด์ ๋ทฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋ค!
Swift (UIKit) ์์๋ ViewController๊ฐ View์ Controller์ญํ ์ ๋์์ ์ํํ๋ค. (์ด๋ฆ๋ ๋ทฐ์ปจ ํํฌํฌ) ์ฆ, Swift์์๋ View์ Controller๊ฐ ํ๋ ์ผ๋ค์ ๋ชจ๋ ViewContrller๋ผ๋ ํ๋์ด ๋ชจ๋ ์ญํ ์ ์ํํ๋ค. ํ๋๋ง.. ๋ฐ์๋ค... ๊ทธ๋ฌ๋ฏ๋ก,,, ์ฑ์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก VC์ ์ญํ ์ด ์์ฒญ ์ปค์ง๊ฒ ๋๊ณ , ๋ชจ๋ธ๊ณผ ๋ทฐ์ ๊ด๊ณ๊ฐ ๊ต์ฅํ ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์๊ฐ ํ๋ค์ด์ง ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
๐ Massive ViewController
iOS์ MVC ํจํด์, Massiveํ๋ค๋ผ๋ ๋๋ด์ด ์๋ค๊ณ ํ๋ค. ๋๋ด? ํธ๋ฃจ์๋๊ฐ!
๊ทธ๋์ ์ด ๊ฑฐ๋ํด์ง๋ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ญํ ์ ๋๋ ์ฃผ์ด์ผํ๋ค. ์,, ์ฐพ์๋ณด๋๊น DataSource๋ฅผ ํ์ฉํด์ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ ๋ฐ์ดํฐ๋ค์ ๋ฐ๋ก ๋นผ์ ๊ด๋ฆฌํด์ฃผ๊ฒ ๋ง๋ค๊ฑฐ๋, Delegate๋ Cordinator ํจํด์ ์ฌ์ฉํด์ ์ญํ ์ ์๊ฒ ์ชผ๊ฐ์ฃผ๊ณ , VC๋ ๋๋๋ก View์ ์ง์คํด์ ๋ณด์ฌ์ฃผ๋ ์ญํ ๋ง ์ํํ๋๋ก ํด์ค๋ค.
๋๋ ์ด์ ์, VC๋ก ๊ฐ๋ฐํ๋ค๊ฐ Coordinator ํจํด์ ์ ์ฉํด๋ณด๋ ํ๋ก์ ํธ์ ์ฐธ์ฌํด๋ณธ์ ์ด ์๋ค. (๊ฐ์ฐ๋๋๊ป์ ์ ์ค๋ช ์ ๋จ๊ฒจ์ฃผ์ จ์์ง,,,) ์ด์จ๋ , ๋ค์ํ ๋ฐฉ์์ผ๋ก Massive VC ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. (์กฐ๊ธ ๋ ์ฑ์ฅํ๋ฉด ์๋ PR๊ณผ ์ด์๋ฅผ ๋ชจ๋ ์ดํดํด๋ณด์)
https://github.com/DeveloperAcademy-POSTECH/MC3-Team7-MoTe/issues/49
https://github.com/DeveloperAcademy-POSTECH/MC3-Team7-MoTe/pull/50
โซ๏ธ MVVM์ด ๋ญ์ง ๊ฐ๋จํ๊ฒ ์ค๋ช ํด๋ณด์.
MVC์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ํจํฐ์ค ํ๋๊ฐ MVVM ์ด๋ค. Model, View, ViewModel ์ธ๊ฐ์ง ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
- Model: ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ์, ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด๋ค.
- View: ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ๋ถ๋ถ์ด๋ค.
- ViewModel: View๋ฅผ ํํํ๊ธฐ ์ํด์ ๋ง๋ View๋ฅผ ์ํ Model์ด๋ค. View๋ฅผ ๋ํ๋ด์ฃผ๊ธฐ ์ํ Data๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๋น์ฆ๋์ค ๋ก์ง๋ค์ด ์ฌ๊ธฐ์ ํฌํจ๋์ด์๋ค.
View ์ ViewModel ์ฌ์ด๋ Commandํจํด๊ณผ Data binding (๋ฐ์ดํฐ๋ฐ์ธ๋ฉ) ํจํด์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์ด์๋ค. Commandํจํด๊ณผ Data Binding์ ์ฌ์ฉํด์ View์ ViewModel์ฌ์ด์ ์์กด์ฑ์ ์์ด๋ค๊ณ ํ๋ค. ViewModel๊ณผ View๋ 1:n ๊ด๊ณ์ด๋ค. (์ญ? ์ดํด๊ฐ ์๊ฐ.. ๋ฌด์จ๋ง์ผ์ง ์ข ๋ ๊ณ ๋ฏผํด๋ณด๊ณ ๋ค์ ํฌ์คํ ํ์. ์ผ๋๋ค ๊ด๊ณ๋ผ์ ๊ทธ๋ฐ๊ฐ?)
- Command(์ปค๋งจ๋) : ์ฌ๋ฌ๊ฐ์ง ์์์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ๋์ ์ก์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ ๊ธฐ๋ฒ
- Data Binding(๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ) : ํ๋ฉด์ ๋ณด์ด๋ ๋ฐ์ดํฐ์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ผ์น์ํค๋ ๊ธฐ๋ฒ, ๋ทฐ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๋ฉด ๋ทฐ์ ๋ฐ๋ก ๋ณ๊ฒฝ๋์ด ๊ฐฑ์ ๋๋ค.
MVVM์ ๋์ ์์๋ฅผ ๋ณด๋ฉด, ์์์ ํ๋ ์ญํ ๋ค์ ์ดํด๊ฐ ์กฐ๊ธ ๋น ๋ฅผ ๊ฒ์ด๋ค.
- View๋ฅผ ํตํด ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์๋ค์ธ๋ค.
- ๋ฐ์ ์ฌ์ฉ์ ์ด๋ฒคํธ๋ Command ํจํด์ผ๋ก ViewModel์ ์ ๋ฌ๋๋ค.
- VIewModel์ Model์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค.
- Model์ ViewModel์๊ฒ ์์ฒญ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋ตํด์ ๋ณด๋ด์ค๋ค.
- ViewModel์ ์๋ต๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น์ฆ๋์ค ๋ก์ง์ ํตํด ์ด๋ฆฌ์ ๋ฆฌ ๊ฐ๊ณตํด์ ์ ์ฅํ๋ค.
- View๋ ViewModel๊ณผ Data Binding ํ์ฌ ํ๋ฉด์ ๊ฐฑ์ ๋ ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ธ๋ค.
MVVM์ View์ Model ์ฌ์ด์ ์์กด์ฑ์ด ์๊ณ , ์ปค๋งจ๋์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํตํด์ ๋ทฐ์ ๋ทฐ๋ชจ๋ธ์ ์์กด์ฑ ๋ํ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ด ๋ถ๋ถ์ ๋ ๋ฆฝ์ ์ด๊ณ ๋ชจ๋ํ ๋์ด ๊ฐ๋ฐ๋ ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ค.
โซ๏ธ MVC๋ก ๊ฐ๋จํ TableView๋ฅผ ๊ตฌํํ๋ค.
์,,, ๊ฐ๋จํ ํ
์ด๋ธ๋ทฐ๋ฅผ ๊ตฌํํ๋ค. ํ
์ด๋ธ๋ทฐ๋ฅผ ๋ง๋๋ ๋ฐฉ์์ ์๋ตํ๊ณ , ๊ทธ๋ฅ ๊นํ๋ธ ์ฝ๋๋ฅผ ์ฌ๋ ค๋๊ฒ ๋ค.
๋ด๊ฐ ๋ง๋ ํ
์ด๋ธ๋ทฐ๋, + ๋ฒํผ์ ๋๋ฅด๋ฉด ๋๋ฅผ์๋ก ํ cell์ฉ ์ฆ๊ฐํ๋๋ก ๋ง๋ค์ด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ reset๋ฒํผ์ ๋๋ฅด๋ฉด ํ
์ด๋ธ๋ทฐ ์ ์ฒด ๋ด์ญ์ด ์ฌ๋ผ์ง๋ค.
ํ์ฌ๋, ์ด ๋ฐ์ดํฐ๋ค๊ฐ ์ถ๊ฐ๋๊ณ ์ญ์ ๋๋ ๋ก์ง๋ค์ด ์ ๋ถ ViewController ๋ด๋ถ์ ์กด์ฌํ๋ค. (๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ฐ๋จํด์ Model ํ์ผ์ ๋ฐ๋ก ๋ง๋ค์ง ์์์ง๋ง, ๊ฐ๋จํ๊ฒ ์ค๋ช ํด์ ViewController๊ฐ ๋ชจ๋ ๊ฒ์ ๊ด์ฌํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
https://github.com/deslog/awesome-swift/tree/main/DesignPattern/DesignPattern/Patterns/MVC
โซ๏ธ MVVM ํจํด์ผ๋ก ๋ฐ๊ฟ๋ณด์!
์ฐ์ , ์ด๋ฒ ํ๋ก์ ํธ์์๋ Combine์ ์ฌ์ฉํด๋ณผ ๊ฒ์ด๋ค. Combine์ ๋ํ ์ค๋ช ์ ์ ์ ๋์ค์ผ๋ก ๋ฏธ๋ฃจ๊ณ , ์ผ๋จ Combnie์ผ๋ก ๊ตฌํํ MVVM ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ์์ฃผ๋ก ์ฝ๋์ค๋ช ์ ํด๋ณด์.
๐ ViewModel ์์ฑ ๋ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ก์ง ์ฎ๊ฒจ์ฃผ๊ธฐ
์ฐ์ ๊ฐ์ฅ ํฌ๊ฒ ๋ฐ๋๋ ๊ฒ์, ๊ธฐ์กด ์ฝ๋์์ tableView์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ reset ํด์ฃผ๋ ๋ก์ง์ด ์ ๋ถ ViewModel์ด๋ผ๋ ํ์ผ๋ก ์ด๋ํ๋ค. ์ฐ์ ์์๋ ViewModel ํ์ผ์ ๋ง๋ค์ด์ฃผ๊ณ , ๊ทธ ์์๋ค๊ฐ ๊ธฐ์กด ViewController์ ์๋ @objc ํจ์๋ค์ ์ฎ๊ฒจ์ฃผ์๋ค.
import Foundation
import Combine
class ViewModel: ObservableObject {
// MARK: - property
@Published var tempArr = [String]()
var arrCnt = 0
// MARK: - life cycle
init() { }
// MARK: - func
@objc func addData(_ sender: Any) {
arrCnt += 1
tempArr.append("\(arrCnt)๋ฒ์งธ ๋ฐ์ดํฐ ์ถ๊ฐ")
}
@objc func resetData(_ sender: Any) {
arrCnt = 0
tempArr = []
}
}
- @Published: ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๊ฐ์งํ ? ๊ฒ์ ๋ฃ์ด์ค๋ค.
- arrCnt: ์ด์ ์ ViewController์ ์์๋ ๋ณ์, ๋ณ๊ฒฝ๋๋ ๋ณ์๋ฅผ ๊ฐ์ ธ์๋ค.
- addData / resetData: ๋ ๊ฐ์ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์์ ๋ฃ์ด์ฃผ์๋ค.
๐ ViewModel์ ์์ฑํ์ผ๋ฉด, ViewController์์ viewmodel์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ๋ฐ๊ฒ ๋ง๋ค์.
1๏ธโฃ ์ฐ์ Combine์ import ํด์ฃผ๊ณ , viewmodel์ ์ ์ธํด์ฃผ์.
import Combine
var disposalbleBag = Set<AnyCancellable>()
var viewModel: ViewModel = ViewModel()
diposalbleBag์ combine์ ํ ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋๋ ์์ด์ด๋ค. ์ด ๋ถ๋ถ์ ๋ํด์๋ combiine ์ค๋ช ํฌ์คํ ์ผ๋ก ๋์ค์ ๋ค์ ์ฌ๋ฆฌ๊ฒ ๋ค! ์ด์จ๋ ์ด๋ ๊ฒ ์ถ๊ฐํด์ค์ผํ๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด, disposalbalbag์ ๋ง๊ทธ๋๋ก ๋ฉ๋ชจ๋ฆฌ์์ ๋๊ฒจ์ง๋ ๋ฐ์ดํฐ๋ฅผ ํ์์ฃผ๊ธฐ ์ํด์ ์ ์ธํด์ค๋ค. ๋ฐ์ดํฐ๋ฅผ subscribeํ๊ณ ๋จ์ ๋ฐ์ดํฐ๋ค์ ๋ด์์ค๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. (bag! ๐ผ)
2๏ธโฃ Button์ ์ค์ ๋ ํ๊ฒ๊ณผ action์ Viewmodel์ ์ํ ๋ฉ์๋๋ค๋ก ๋ฐ๊ฟ์ฃผ์.
private lazy var resetButton = UIBarButtonItem(title: "Reset",
style: .plain,
target: self.viewModel,
action: #selector(viewModel.resetData(_ :)))
private lazy var addButton = UIBarButtonItem(image: UIImage(systemName: "plus.circle"),
style: .plain,
target: self.viewModel,
action: #selector(viewModel.addData(_ :)))
3๏ธโฃ ViewModel์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํด์ฃผ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฃผ์.
์ง๊ธ ๋ด ์ฝ๋์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํด์ฃผ๋ ์ฝ๋ ํ๋ฉ์ด๋ฆฌ์, ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ function์ ์คํ์์ผ์ค์ผํ ๋ function์ ๋ฐ์ธ๋ฉํด์ฃผ๋ ๋ฉ์ด๋ฆฌ ๋๋ฉ์ด๋ฆฌ๋ก ์ฝ๋๋ฅผ ์์ฑํด๋์๋ค.
fileprivate func setBindings() {
// ๋ฐ์ดํฐ์ ๋ํ ๋ฐ์ธ๋ฉ
viewModel.$tempArr.sink{ (updatedList: [String]) in
self.tempArr = updatedList
// self.tableView.reloadData()
}.store(in: &disposalbleBag)
// ์ก์
์ ๋ํ ๋ฐ์ธ๋ฉ (๋ทฐ์ ๊ด๋ จํ ํจ์ ๋ก์ง๋ ์ ๋ถ ๋ทฐ๋ชจ๋ธ์ ์๊ณ , ๊ทธ ์ก์
์ ๋ฐ์ธ๋ฉํด์ฃผ๋ ๋ฐฉ๋ฒ)
viewModel.dataUpdateAction.sink{ (addingType: ViewModel.AddingType) in
print("addingํ์
์ ์ด๊ฒ \(addingType)")
switch addingType {
case .add:
self.tableView.reloadData()
default:
self.tableView.reloadData()
}
}.store(in: &disposalbleBag)
}
- tempArr: Viewmodel์์ published๋ก ์ ์ธ๋์ด์๋ค. ์ด ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋์ด ์๋ค๊ฐ๋ค ๋๋ฉด์ ๋ฐ์ธ๋ฉ ๋์ด์ง ๊ฒ์ด๋ค.
- sink: ์ค๋ช ์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์์๋ค. ๊ตฌ๋ ํ๋ค๋ผ๊ณ ํํ ์ด์ผ๊ธฐํ๋ค. ์ด๋ค published๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌ์ค๊ฑด์ง ์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค. ์ฌ๊ธฐ์๋ tempArr์ด๋ค.
- store: ๊ตฌ๋ ํ๊ณ ๋จ์ ์์ด๋ค์ ์ฌ๊ธฐ๋ค๊ฐ ๋ด์์ฃผ์! ์ ์๋ฏธ
์ฆ, ์ค๋ช ํ์๋ฉด sink๋์ด ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ค์ tempArr์ ๋ฃ์ด์ฃผ๊ฒ๋ค๋ ์๋ฏธ์ ์ฝ๋๊ฐ ๋๋ค. ํด๋ก์ ๋ฅผ ์ฌ์ฉํด์ ๋ด๋ถ์ updatedList๋ฅผ tempArr์ ๋ฃ์ด์ฃผ์๋ค!
dataUpdateActionํจ์๋, ๋ฒํผ์ ํด๋ฆญํ ๋ ํน์ ์ก์ ์ ๋ฃ์ด์ฃผ๊ณ ์ถ์ด์ ํ๋ฒ ๋ฃ์ด๋ดค๋ค. ์ ์ฝ๋์์๋, AddingType์ด๋ผ๋ enumํ์ ์ ์ ๋ฌ๋ฐ๋๋ฐ, addButton์ด ๋๋ฆฌ๋ฉด .add๋ฅผ ์ ๋ฌํ์ฌ ํน์ ํจ์ (์ฌ๊ธฐ์๋ ๊ทธ๋ฅ reloadData()๋ฅผ ํด์ฃผ์๋ค.)๋ฅผ ์คํ์์ผ์ค ์ ์๋๋ก ํ๋ค. reloadData๋ ์ฌ์ค tempArr๋ฅผ sink๋ฐ์ ๋ ๋ฃ์ด๋ ๋์ง๋ง (์ฃผ์์ฒ๋ฆฌ๋์ด ์์) ๋ง์ฝ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ reload()๋ฅผ ํด์ฃผ์ด์ผํ๋ ์ํฉ์ด ์จ๋ค๋ฉด, ์๋์ฒ๋ผ action์ ๋ํ binding๋ ๋ฐ๋ก ๊ตฌํํด์ ๋ง๋ค์ด์ค์ผํ๋ค!
์ค๋ช ์ด ์กฐ๊ธ ์ ๋๋์ง,, ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ผ๋จ '๊ฐ๋ฐํ๋ ์ ๋๋ฆฌ๋'์ ์์์ ๋ณด๋ฉด ๋ ์์ํ๊ฒ ์ดํด๊ฐ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ , ์ ์ฒด ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ ์ดํด๊ฐ ๋น ๋ฅผ ๊ฒ์ด๋ค!
๊ฐ๋ฐํ๋ ์ ๋๋ฆฌ๋์ ์ ํ๋ธ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด์ ํฌ์คํ ์์ฑํฉ๋๋ค.
(https://www.youtube.com/watch?v=TLX7MjtOPd0&t=873)
https://github.com/deslog/awesome-swift/tree/main/DesignPattern/DesignPattern/Patterns/MVVM
์ด๋ ๊ฒ ์ง์ ๋ด๊ฐ MVVM์ ๊ตฌํํด๋ดค๋ค. ๋ฌผ๋ก , ์ง๊ธ์ ์ข์ ํํ ๋ฆฌ์ผ ๊ฐ์์ ์์ฃผ ๊ฐ๋จํ ์์ ๋ง ์ํํด์ฃผ์๊ธฐ ๋๋ฌธ์ ํ ๋งํ๋ค! ๋ผ๋ ๋ง์ด ๋์๋๊ฒ ๊ฐ๋ค. ๋ด ๋ชฉํ๋ ๋์์ด ๊ฐ๋ฐ์ด ๋๋๋ฉด, ๋์์ด ํ๋ก์ ํธ ์ ๋ฐ์ MVVM์ผ๋ก ๋ฐ๊ฟ๋ณด๋๊ฒ์ด๋ค!
๐ Reference
https://github.com/TuenTuenna/ios_uikit_dynamic_tableview/tree/fetch_more
'Computer > Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋์์ธํจํด] (Swift) Singleton Pattern (์ฑ๊ธํค ํจํด ๊ตฌํํด๋ณด๊ธฐ) (0) | 2023.02.06 |
---|---|
[๋์์ธํจํด] (iOS) ๋์์ธ ํจํด์ด๋? ๊ฐ์ ๋ฐ ๋ถ๋ฅ ๋ฐฉ๋ฒ! (0) | 2022.09.27 |