- ํ๋ชจ์ Wonbi๊ฐ ๋ง๋ ํ๋ก์ ํธ ๋งค๋์ App์ ๋๋ค.
- ํ ์๊ฐ
- ํ ์ํค
- ์คํ ํ๋ฉด
- Diagram
- ํด๋ ๊ตฌ์กฐ
- ํ์๋ผ์ธ
- ๊ธฐ์ ์ ๋์
- ํธ๋ฌ๋ธ ์ํ ๋ฐ ๊ณ ๋ฏผ
- ์ฐธ๊ณ ๋งํฌ
Wonbi | Hamo |
---|---|
ํ๋ก์ ํธ ์ถ๊ฐ |
---|
ํ๋ก์ ํธ ํธ์ง |
---|
ํ๋ก์ ํธ ์ญ์ |
---|
ํ๋ก์ ํธ ์ํ ๋ณ๊ฒฝ |
---|
ProjectManager
โโโ Info.plist
โโโ Resources
โย ย โโโ AppDelegate.swift
โย ย โโโ SceneDelegate.swift
โโโ Sources
โโโ Extension
โย ย โโโ Date+.swift
โโโ Model
โย ย โโโ Project.swift
โย ย โโโ State.swift
โโโ View
โย ย โโโ Components
โย ย โย ย โโโ CountLabel.swift
โย ย โย ย โโโ HeaderView.swift
โย ย โย ย โโโ ProjectCell.swift
โย ย โโโ Controllers
โย ย โโโ AddViewController.swift
โย ย โโโ EditViewController.swift
โย ย โโโ MainViewController.swift
โย ย โโโ ProjectListViewController.swift
โย ย โโโ ProjectViewController.swift
โโโ ViewModel
โโโ AddViewModel.swift
โโโ EditViewModel.swift
โโโ HeaderViewModel.swift
โโโ MainViewModel.swift
โโโ ProjectCellViewModel.swift
โโโ ViewModelDelegate.swift
- ๊ธฐ์ ์คํ ๊ฒฐ์
- โ ์๊ตฌ์ฌํญ๊ณผ ํ์ฌ ์ํฉ์ ๊ฐ์ฅ ์ ํฉํ๋ค ํ๋จ๋๋ ๊ธฐ์ ์คํ ๊ฒฐ์
- ์ค์น
- โ SPM์ ์ด์ฉํ FireBase ์ค์น
- โ brew๋ฅผ ์ด์ฉํ SwiftLint ์ค์น
- ํ๋ฉด ๊ตฌํ
- โ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ 3๊ฐ์ ํ ์ด๋ธ ๋ทฐ์ ํค๋ ๊ตฌํ
- โ ์ถ๊ฐ์ ์์ ์ ํ ์ ์๋ Add/Edit๋ทฐ ๊ตฌํ
- ๊ธฐ๋ฅ ๊ตฌํ
- โ ์ถ๊ฐ ๋ฒํผ์ ํฐ์นํ๊ฑฐ๋ ๊ฐ ํ๋ก์ ํธ์ ์ ์ ํฐ์นํ์ ๋ ๊ฐ๊ฐ Add/Edit๋ทฐ๋ฅผ ํ๋ฉด์ ๋์ฐ๋๋ก ๊ตฌํ
- โ ์ฌ์ฉ์๊ฐ ์ ์ ๊ธธ๊ฒ ๋๋ฅด๋ฉด popover๊ฐ ๋ํ๋ ์ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋๋ก ๊ตฌํ
- โ ์ฌ์ฉ์๊ฐ ์ ์ ์ค์์ดํํ๋ฉด ํ๋ก์ ํธ๋ฅผ ์ญ์ ํ ์ ์๋๋ก ๊ตฌํ
ํผ์ณ๋ณด๊ธฐ
1๏ธโฃ HeaderView
- titleLabel
- ์ฌ์ฉ์์ ํ๋ก์ ํธ์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ ์ด๋ธ์ ๋๋ค.
- countLabel
- ์ฌ์ฉ์์ ํ๋ก์ ํธ์ ์ด ๊ฐฏ์๋ฅผ ๋ํ๋ด๋ ๋ ์ด๋ธ์ ๋๋ค.
2๏ธโฃ CountLabel
- ์ปค์คํ
๋ ์ด๋ธ
- ๋ฐฐ๊ฒฝ์ ๋๊ทธ๋ ๋ชจ์์ผ๋ก ๊น์ ๋๊ทธ๋ ๋ชจ์์ ์ปค์คํ ๋ ์ด๋ธ์ ๋๋ค.
- ์ซ์๊ฐ ์ปค์ ธ์ ๊ฐ๋ก๋ก ๊ธธ์ด์ง๋ฉด ๊ธธ์ด์ ๋ง๊ฒ ์บก์๋ชจ์์ผ๋ก ๋ณํํฉ๋๋ค.
3๏ธโฃ ProjectCell
- ํ ์ด๋ธ๋ทฐ์์ ์ฌ์ฉํ๊ธฐ ์ํ ์ปค์คํ ์ ์ ๋๋ค.
1๏ธโฃ AddViewController
- ์ถ๊ฐํ๊ธฐ ๋ฒํผ(+ ๋ฒํผ)์ ๋๋ ์ ๋ ๋ํ๋๋ ๋ทฐ ์ ๋๋ค.
- pageSheet๋ฐฉ์์ ๋ชจ๋ฌํ๋ฆฌ์ ํ ์ด์ ์ ์งํํฉ๋๋ค.
2๏ธโฃ EditViewController
- ํ๋ก์ ํธ ์ ์ ๋๋ ์ ๋ ๋ํ๋๋ ๋ทฐ ์ ๋๋ค.
- AddViewController์ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ๋ฉด์ ๋์ฐ์ง๋ง, Edit๋ฒํผ์ด ์์ด ๋ด์ฉ์ ์์ ํ ์ ์์ต๋๋ค.
3๏ธโฃ ProjectViewController
- AddViewController์ EditViewController๊ฐ ์์ํ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
- ๋ ์ปจํธ๋กค๋ฌ๋ ํ๋ฉด ๊ตฌ์ฑ์์๊ฐ ๋ฒํผ์ ์ ์ธ ํ๋ฉด ๋์ผํ๊ธฐ ๋๋ฌธ์ ์์์ ํตํด ๊ตฌํํ๋๋ก ํ์์ต๋๋ค.
4๏ธโฃ MainViewController
- ์ฒ์ ํ๋ฉด์ ๋ํ๋๋ ๋ฉ์ธ ๋ทฐ์ ๋๋ค.
- 3๊ฐ์ ProjectListViewController๋ฅผ ์ฐจ์ผ๋ ๋ทฐ์ปจํธ๋กค๋ฌ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค.
5๏ธโฃ ProjectListViewController
- ํ๋์ ํ ์ด๋ธ ๋ทฐ๋ฅผ ๊ฐ์ง๋ MainViewController์ ์ฐจ์ผ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ ์ ๋๋ค.
- ํ ์ด๋ธ ๋ทฐ ์ ํค๋ ๋ทฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๊ฐ๊ฐ ๋ด๋นํ๋ ํ๋ก์ ํธ ์ํ์ ๋ง๊ฒ ํ๋ฉด์ ์ถ๋ ฅํด์ค๋๋ค.
1๏ธโฃ AddViewModel
- ์ฌ์ฉ์๊ฐ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ ํ ์ ์ฅํ๋ฉด, ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ViewModelDelegate๋ฅผ ํตํด MainViewModel๋ก ๋๊ฒจ์ค๋๋ค.
2๏ธโฃ EditViewModel
- ์ฌ์ฉ์๊ฐ ์
์ ํฐ์นํ๋ฉด ๊ทธ ์
์ ์๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์
project
ํ๋กํผํฐ๋ฅผ ์ ๋ฐ์ดํธ ํฉ๋๋ค. - ์ฌ์ฉ์๊ฐ Edit ๋ฒํผ์ ๋๋ฅด๋ฉด
isEditing
ํ๋กํผํฐ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธ ํฉ๋๋ค. - ์ฌ์ฉ์๊ฐ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์ฅํ๋ฉด, ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ViewModelDelegate๋ฅผ ํตํด MainViewModel๋ก ๋๊ฒจ์ค๋๋ค.
3๏ธโฃ HeaderViewModel
- ProjectListViewController๊ฐ ์ด๊ธฐํ ๋ ๋ title๊ณผ cellCount๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ํ๋ฉด์ ๋ํ๋ผ cellCount์ ๋ด์ฉ์ String์ผ๋ก ๋ณํํ์ฌ ์ ๋ฐ์ดํธํฉ๋๋ค.
4๏ธโฃ MainViewModel
- ๊ฐ๊ฐ ์ํ๋ณ Project ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ์์ด ํ๋ฉด ํ ์ด๋ธ ๋ทฐ ์ ์ ๋ํ๋ผ ๋ด์ฉ์ ์ ๋ฐ์ดํธ ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์๋ก ์ถ๊ฐํ ํ๋ก์ ํธ๋ ์์ ํ ํ๋ก์ ํธ๋ฅผ ๊ฐ ํ ์ด๋ธ ๋ทฐ์ ์ ์ฉํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋กฑ ํ๋ ์ค ์ ์ค์ณ๋ฅผ ํตํด ํ๋ก์ ํธ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ด๋ฅผ ๋ฐ์ํฉ๋๋ค.
5๏ธโฃ ProjectCellViewModel
- ๊ฐ ์ ์ ๋ค์ด๊ฐ ๋ด์ฉ 3๊ฐ์ง๋ฅผ ๊ฐ๊ฐ ์ ์ ๋ค์ด๊ฐ ๋ด์ฉ์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํฉ๋๋ค.
- ๋ง๊ฐ์ผ์ด ์ง๋ฌ๋์ง ํ๋จํ๊ณ ์ง๋ฌ๋ค๋ฉด ๋นจ๊ฐ์์ ๊ฐ์ด ๋๊ฒจ์ค๋๋ค.
1๏ธโฃ Project
- ์ ๋ชฉ, ๋ง๊ฐ์ผ, ์์ธ๋ด์ฉ, ์ํ๋ฅผ ๊ฐ๊ฐ String๊ณผ Date, State ํ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ธ ๊ฐ์ฒด์ ๋๋ค.
- ๊ฐ ๊ฐ์ฒด๋ UUID๋ฅผ
id
ํ๋กํผํฐ๋ก ๊ฐ์ง๊ณ ์์ด ๋ด์ฉ์ด ์ ํํ ์ผ์นํ๋๋ผ๋ ์ด ๊ฐ์ฒด๋ค์ ๊ตฌ๋ณํ ์ ์์ต๋๋ค.
2๏ธโฃ State
- ํ๋ก์ ํธ์ ์ํ๋ฅผ Todo, Doing, Done 3๊ฐ์ง๋ก ์ ํํ๋ ์ด๊ฑฐํ ๊ฐ์ฒด์ ๋๋ค.
- ๊ฐ ์ํ์ ์ด๋ฆ์ ์๋ ค์ฃผ๋ name ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
1๏ธโฃ ViewModelDelegate
- AddViewModel๊ณผ EditViewModel์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ๋ ์์ ์ ๋์ ์ํํ๋ ๋๋ฆฌ์ ๊ฐ์ฒด์ ๋๋ค.
2๏ธโฃ ProjectListActionDelegate
- ๋ฆฌ์คํธ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๋์ ๋๊ฒจ์ค ๋๋ฆฌ์ ๊ฐ์ฒด์ ๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- ์์คํ ์ด ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ธ ์์คํ ์ฑ ์์ ํ์ ํ๊ณ ์ด๋ฅผ ๋ ์์ ์ฑ ์์ผ๋ก ๋ถํ ํ์ฌ ์ด๋ฅผ ์ํํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ฑ ์์ ํ ๋นํ๋ ์ค๊ณ๋ฒ์ ๋๋ค.
- ๊ฐ์ฒด๊ฐ ์ธ๋ถ์ ๋ณด์ฌ์ค์ผ ํ๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ ํ๊ธฐ ์ข์ต๋๋ค. ์ฆ, ์บก์ํ์ ์ฉ์ดํฉ๋๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ๋ ์ธํฐํ์ด์ค๋ง ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ๊ณ ๊ฐ์ฒด๊ฐ ๊ฐ์ ธ์ผํ ์ฑ
์์ด ๋๋ ทํด์ ธ์ ์์ง๋๊ฐ ๋์ ์ค๊ณ๋ฅผ ํ ์ ์์ต๋๋ค.
- ๐ก ์ฑ ์ ์ฃผ๋ ์ค๊ณ๋ฅผ ํตํด ์ข ๋ ๊ฐ์ฒด์งํฅ์ ์ด๊ณ , ์ญํ ์ด ๋๋ ทํ๊ณ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ณ ์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- Swift Package Manager๋ Xcode 11 ๋ถํฐ ์ ํ์์ ๊ณต์์ผ๋ก ์ง์ํ๊ณ Xcode์ ๋ด์ฅ๋ ์์กด์ฑ ๊ด๋ฆฌ๋๊ตฌ๋ก, Cocoa Pod์ ๋นํด package๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๊ณ podfile์ ๊ด๋ฆฌํ์ง ์์๋ ๋๋ ์ฅ์ ์ด ์์ต๋๋ค.
- ๋, ์จ๋ํํฐ์ธ CocoaPods ๊ณผ๋ ๋ฌ๋ฆฌ ํผ์คํธํํฐ ํด์ด๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ค์น๊ฐ ํ์์๋ ์ฅ์ ๋ ์๊ณ , Xcode์ ๋ด์ฅ๋ ๋๊ตฌ์ด๊ธฐ ๋๋ฌธ์ Xcode ์ฌ์ด๋๋ฐ์ ๋ช
ํํ๊ฒ ํ์ํ๊ณ ํจํค์ง์ ํ์ฌ ๋ฒ์ ๋ ๋ณด์ฌ์ค๋๋ค.
- ๐ก ์ด๋ฒ ํ๋ก์ ํธ์์๋ Firebase ๋ฑ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ๊ฐ๋ฐํ๋๋ฐ, ์ข ๋ ํธ๋ฆฌํ๊ณ ์ง๊ด์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ SPM์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ ํธ์์ฑ์ ๋์ฌ๋ณด๊ณ ์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- MVVM์ ๊ฐ๋จํ ์ฅ๋จ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฅ์
- View์ Model์ด ์๋ก ์ ํ ์์ง ๋ชปํ๊ธฐ์ ๋ ๋ฆฝ์ฑ์ ์ ์งํ ์ ์๊ณ , ์ ๋ํ ์คํธ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฐ ์ญํ ๊ณผ ์ฉ๋์ ๋ฐ๋ผ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํ๋ค.
- ๋จ์
- ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ํ์์ ์ผ๋ก ์๊ตฌ๋์ด ์ค๊ณ์ ์ด๋ ค์์ด ์์ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ๋ง์ด ์๊ณ , UI๊ฐ ๊ฐ๋จํ ์ฑ์์๋ ์คํ๋ ค ์ค๊ณ๊ฐ ์ด๋ ค์ ์ง ์ ์์ต๋๋ค.
- ๐ก MVC์์ ViewController๊ฐ ๋ง์ ์ญํ ์ ๋ด๋นํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ญํ ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด์ MVVM์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
๋ฌธ์ ๐ป
- ํ๋ก์ ํธ ์๊ตฌ์ฌํญ ์ค ๊ฐ ์ํ์ ๊ฐฏ์๋ฅผ ํํํ๋ ์ซ์๋ฅผ ๋๊ทธ๋ผ๋ฏธ ๋ชจ์์ผ๋ก ๊ฐ์ธ์ ๋ณด์ฌ์ค์ผ ํ์ต๋๋ค.
- ๋๊ทธ๋ผ๋ฏธ ๋ชจ์์ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ณ ๊ทธ์์ ์ซ์ ๋ ์ด๋ธ์ ์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ์ง๋ง ๋๋ฌด ๋ณต์กํ ๋ฐฉ๋ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค.
- ๋ํ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด, ์ซ์์ ํฌ๊ธฐ๊ฐ ์ปค์ง๊ฒฝ์ฐ, ๋ ์ด๋ธ ํฌ๊ธฐ์ ๋ง๊ฒ ๋ทฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ด ๋๋ฌด ๋ณต์กํ์ต๋๋ค.
ํด๊ฒฐ ๐ซ
final class CountLabel: UILabel {
private let padding = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8)
override func draw(_ rect: CGRect) {
super.draw(rect)
layer.masksToBounds = true
layer.cornerRadius = rect.height / 2
}
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: padding))
}
override var intrinsicContentSize: CGSize {
var contentSize = super.intrinsicContentSize
contentSize.height += padding.top + padding.bottom
contentSize.width += padding.left + padding.right
return contentSize
}
}
- ๋ ์ด๋ธ์ layer์ ์ ๊ทผํ์ฌ
cornerRadius
๊ฐ์ ์ฃผ๊ณbackgroundColor
๋ฅผ ๊ฒ์ ์์ผ๋ก ์ค์ ํ์ฌ ๋ ์ด๋ธ ๊ธธ์ด์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๋ณํ๋๋ก ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค. - ๋ํ, UILabel์ padding๊ฐ์ ์ค์ ํ๋ ํ๋กํผํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์,
intrinsicContentSize
๋ฅผ ์ด์ฉํ์ฌ padding๊ฐ์ ์ฃผ๋๋ก ์ปค์คํ ๋ ์ด๋ธ์ ๋ง๋ค์ด ์์ฐ์ค๋ฌ์ด ๋ชจ์์ ๋๊ทธ๋ผ๋ฏธ์ ์บก์๋ชจ์์ ๊ฐ์ง๋๋ก ํ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- MVVM ์ํคํ ์ฒ๋ฅผ ์ ์ฉํ๊ณ ์ฌ์ฉํ๋๋ฐ ์์ด์ ์ฌ๋ฌ๊ฐ์ง ์ฅ๋จ์ ์ ์ง์ ๋๊ปด๋ณผ ์ ์์์ต๋๋ค.
- ๋จผ์ , ํ์คํ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ํฌ๊ธฐ๊ฐ ๋ง์ด ์ค์ด๋ค๊ณ ๊ฐ์์ ์ญํ ์ ๋ง๊ฒ ๊ฐ์ฒด๋ฅผ ๋๋์ด ์ข ๋ ๊ฐ์ฒด์งํฅ์ ์ธ ์ค๊ณ๋ฅผ ํ ์ ์์๋ค ์๊ฐํ์ต๋๋ค.
- ๋๋ถ์ด, ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ญํ ์ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์์ ์ธํฐ๋ ํฐ๋ธ๋ฅผ ๋๊ฒจ์ฃผ๋ ์ญํ ๋ก ์ฐ๋ค๋ณด๋, ๊ฐ์ฒด๊ฐ ์์กด๋๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ๊ฐ์ง๊ฒ ํ ์ ์์๊ณ , ์ด๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๊ฐ ๋์จํ ๊ฒฐํฉ์ ๊ฐ์ง ์ ์๋๋ก ํ ์ ์์์ต๋๋ค.
- ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ณผ์ ์์ ์ฝ๋ฐฑํจ์๋ฅผ ํ์ฉํ๋ค๋ณด๋ ํ๋ฆ์ ์ฝ๊ธฐ ์ด๋ ค์ ์ฌ๋ฌ๋ฒ ๋ค์ ์ฝ์ผ๋ฉด์ ์ดํดํ๋ ์๊ฐ๋ค์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๊ณ , ์ฝ๋์ ๋ณต์ก๋๊ฐ ๋ง์ด ์ฌ๋ผ๊ฐ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๋ํ, ๊ฐ์ฒด๊ฐ ์ญํ ์ ์ง์คํด์ ๊ฐ๋ฐ์ ์งํํ๋ค ๋ณด๋ MVC๋ณด๋ค ๊ฐ๋ฐ ์๋๊ฐ ํ์ ํ ๋๋ ค์ง๋ ๊ฒ์ ๋๊ผ์ต๋๋ค.
- ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ Functional Reactive Programming์ ์ข ๋ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค ์๊ฐํ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- enum ์ฌ์ฉ
- ocp๋ฅผ ์๋ฐํ๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค.
- case๊ฐ ์ถ๊ฐ๋ ๊ฒฝ์ฐ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
- ๋ชจ๋ธ ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ๊ฐ state๋ณ ๊ตฌ์ฒด ํ์
์์ฑ
- state๊ฐ ์ถ๊ฐ๋๋๋ผ๊ณ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ํ์ฅํ ์ ์์
- ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ค.
ํ์ฌ ํ๋ก์ ํธ์์ ํต์ฌ ๋ก์ง ์ค ํ๋๋ todo, doing, done ์ธ๊ฐ์ง ์ข
๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๋ ๋ก์ง์ด๋ผ ์๊ฐํ์ต๋๋ค.
์ด ๋ก์ง์ ์ํํ๊ธฐ ์ํด ๋ชจ๋ธ ์์ enum์ ์ฌ์ฉํด์ ๊ฐ ์ผ์ด์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์ผ์ด์ค๋ณ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ๋๊ฒ์ด ๋ง๋๊ฒ์ธ๊ฐ? ์๋๋ฉด ์ธ๊ฐ์ง์ ๊ฐ๊ฐ์ ๋ค๋ฅธ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ๊ทธ ๋ชจ๋ธ์ ํด๋นํ๋ ViewModel๊ณผ View๋ฅผ ๊ฐ๊ฐ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋ง๋๊ฒ์ธ๊ฐ? ๋ผ๋ ๊ณ ๋ฏผ์ ํ์ต๋๋ค.
๋ ์์ ๋ฐฉํฅ์ฑ์ด ์๋ชป๋ ๊ฒ์ ์๋๊ฐ? ์ธ๊ฐ์ง ์ํ๋ฅผ ๊ผญ ๋ถ๋ฅํ ํ์๊ฐ ์๋๊ฐ? ์ํ๋ผ๋ ํ๋์ ๊ฐ ๋๋ฌธ์ ์ธ๊ฐ์ง์ ๋ชจ๋ธ์ด ์๊ธฐ๋ ๊ฒ์ด ์ณ์ ๋ฐฉํฅ์ฑ์ธ๊ฐ? ์ํ๋ ๋ชจ๋ธ์ ํ๊ฐ์ง์ ์์ฑ์ ๋ถ๊ณผํ๋ฐ, ์ด ํ๋กํผํฐ ํ๋ ๋๋ฌธ์ ๋ชจ๋ธ์ด ๋ถ๊ธฐ ๋๋ ๊ฒ์ด ๋ง๋ ๊ฒ์ธ๊ฐ? ๋ผ๋ ๊ณ ๋ฏผ์ ๋๋ฌํ๊ฒ ๋์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๊ฐ ์ํ์ ๋ฐ๋ผ ๋ชจ๋ธ์ ๊ฐ์ง๋ ๊ฒ์ด ์๋๋ผ ํ๋์ ๋ชจ๋ธ์ด ์ํ๋ฅผ ์ด๊ฑฐํ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๋ฐฉํฅ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค. OCP๋ฅผ ์๋ฐํ๋ ๊ฒ์ด ์๋๊น ๋ผ๋ ์๊ฐ์ด ๋ค์์ง๋ง, ๊ทธ ๋ฆฌ์คํฌ๋ณด๋ค ํจ์ฌ ๋ ์ข์ ์ฝ๋ ๊ฐ๋
์ฑ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๋จ์ํ ํ ์ ์๋ ๋ฆฌํด์ด ๋ ํฌ๋ค๊ณ ๊ฒฐ๋ก ์ง๊ณ ์ด ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
Dateํ์
์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ชจ๋ธ์ Dateํ์
์ผ๋ก Deadline์ ๊ฐ์ง๊ณ ์์ง๋ง, ๋ทฐ๋ ์ด๋ฅผ String์ผ๋ก ๋ฐ์์ ํํํด์ผํฉ๋๋ค. ์ด ๊ฐ์ ํธ๋ ์คํผ ํ๋ ๊ฐ์ฒด๋ ๋๊ฐ ๋์ผ ํ๋์ง ๊ณ ๋ฏผํ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก Cell์ ViewModel์ ๋ง๋ค์ด Dateํ์
์ ๊ฐ์ String์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ก์ง์ ๊ฐ์ง๊ฒ ํ๊ณ Date Extension์ ํตํด์ DateFormatter์ formatting๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
ํ๋์ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ฉด ๋ณ๋์ฌํญ์ด ํ๋ ์๊ฒผ์ ๋ ๋ชจ๋ ํ ์ด๋ธ๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ๋ ์์ ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ 3๊ฐ๋ก ๋๋์ด์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ ํ ์ด๋ธ๋ทฐ๋ง ์์ ์ ์ํํ๋๋ก ํ๋ ค๊ณ ํ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ํ ์ด๋ธ๋ทฐ๊ฐ ์์ ์ ๋ชจ๋ธ๋ง ๋ฐ๋ผ๋ณด๊ฒ ๋๊ณ , ๋ชจ๋ ํ ์ด๋ธ ๋ทฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ๋ ์์ ์ ํ์ง ์๊ฒ ๋๋ ์ฅ์ ์ด ์์์ต๋๋ค. ํ์ง๋ง ๋ถ๊ธฐ์ฒ๋ฆฌ๊ฐ ๋ง์ด ์๊ธฐ๋ ๋จ์ ์ด ๋ฐ์ํ์ต๋๋ค.
[๊ณต์๋ฌธ์]
Swift Package Manager
intrinsicContentSize
Firebase
SwiftLint Rules