TMDB API๋ฅผ ํ์ฉํ ์ํ, ์๋ฆฌ์ฆ ์ด๋ํ ์ ์๋ ์ฑ
![]() |
![]() |
![]() |
![]() |
---|
- ์ธ์: 3์ธ
- ๊ธฐ๊ฐ: 24.10.08 ~ 24.10.14 (6์ผ)
- ์ต์ ๋ฒ์ : iOS 15.0+
-
๋ธ๋์น ์ ๋ต:
Github Flow
+develop
๋ธ๋์น๋ฅผ ์ถ๊ฐํ ํํ๋ก ์ฌ์ฉ- ๊ฐ ๊ธฐ๋ฅ์ ๋ณ๋์
feature
๋ธ๋์น์์ ๊ฐ๋ฐ๋๊ณ ,develop
๋ธ๋์น์์ ํตํฉํ์ฌ ํ ์คํธ - ์ด๋ก์จ ์๋ก์ ์์ ์ ์ํฅ๋ฐ์ง ์๊ณ ๊ฐ๋ฐ์ ์งํํ๋ฉฐ, ์ถฉ๋ ์ต์ํ ๊ฐ๋ฅ
- ์์ ์ ์ธ
main
๋ธ๋์น ์ ์ง: ๊ฒ์ฆ๋ ์ฝ๋๋งmain
๋ธ๋์น์ ๋ณํฉ ๋ฐ ํญ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํ ์ ์ง
- ๊ฐ ๊ธฐ๋ฅ์ ๋ณ๋์
-
์ปจ๋ฒค์
- PR Template PR Template ํตํด ์ผ๊ด๋ PR ํ์ ์ ์ง
- ์ปค๋ฐ ์ปจ๋ฒค์
๋๋ฆฌ ์๋ ค์ง
Karma ์ปจ๋ฒค์
์ ์ฑํ - ์ฝ๋ ์ปจ๋ฒค์
swiftLint
๋ฅผ ํ์ฉํด ํฉ์๋ ์ฝ๋ ์ปจ๋ฒค์ ๊ณต์
-
์์ ๋ถ๋ฐฐ
- ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฐ ํ๋ก์ ํธ์ ๋ํ ๊ตฌ์กฐ ์ค์ ๋ฐ ํด๋๋ง ์์
- ๊ณตํต ๊ธฐ๋ฅ -
Network
,DB
,ViewComponent
์ฌ๋ฌ ํ๋ฉด์์ ์์กด์ฑ์ด ์กด์ฌํ๊ฑฐ๋, ์ฌ์ฌ์ฉ ๋๋ ๊ธฐ๋ฅ ๋จผ์ ๊ตฌ์ฑ - ๊ตฌ์ฑ์๋ณ ๋ด๋น์
๋ฌด ๋ถ๋ฐฐ
- ๊น์ฑ๋ฏผ: DB ์คํค๋ง ๋ฐ Repository ๊ตฌ์ฑ
- ์ด์นํ: ๋คํธ์ํฌ ๋ชจ๋ํ ๋ฐ ์ค๋ฅ์ฒ๋ฆฌ
- ํ์ ๋ฏผ: ์ปค์คํ ๋ทฐ ๋ฐ ๊ณตํต UI ์์
- ์ดํ ์์
์
ViewController
๋จ์๋ก ๋๋์ด ์งํ
-
PR Flow
- PR ์์ฒญ
- ์ฝ๋๋ฆฌ๋ทฐ ๋ฐ ์น์ธ
- PR ์น์ธ
๋ฆฌ๋ทฐ๊ฐ ์๋ฃ๋ PR์
develop
๋ธ๋์น์ ๋ณํฉ๋ฉ๋๋ค.
-
Conflict ํด๊ฒฐ ๊ณผ์
- ํ๋ก์ ํธ ํ์ผ ๋ณ๊ฒฝ ์ต์ํ๋ฅผ ์ํด ์๋ก์ด ํ์ผ ์ถ๊ฐ๋ ์ค์ ๋ณ๊ฒฝ ์ ํ์๋ค๊ณผ ์ฌ์ ํ์ ์งํ
- ๋จธ์ง ํ์ ์งํ
ํ์ ์์ ์
Merge time
์ ์ง์ ํ์ฌ ํ์๋ค์ด ๋ชจ์ฌ ๋ณํฉ ์์ ์ ํจ๊ป ์ํ
์ ๊ทน์ ์ธ ์ํต์ ํตํ ์ค์๊ฐ ์ถฉ๋ ํด๊ฒฐ ๋ฐ ๋ณํฉ ๊ณผ์ ์์์ ์์ฐ์ฑ ํฅ์
- ์ ํ๊ณผ ํํ ์์ ๊ณ ๋ ค ์๋ก ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ ์ ํ ์์ ๊ณผ ํํ ์์ ์ ๊ตฌ๋ถํ์ฌ ๋ณํฉ ์์ ๊ฒฐ์
์ค์ํ ๊ธฐ๋ฅ์ด๋ ๊ณตํต ๋ชจ๋์ ์ฐ์ ์ ์ผ๋ก ๋ณํฉํ๊ณ ์ด์ ์์กดํ๋ ๊ธฐ๋ฅ๋ค์ ๊ทธ ์ดํ์ ๋ณํฉํ์ฌ ์ถฉ๋ ๋ฐฉ์ง
๋ถ์ผ | ๊ธฐ์ ์คํ |
---|---|
๐๏ธ Architecture | MVVM + Input & Output ํจํด |
โป๏ธ ๋น๋๊ธฐ | RxSwift |
๐ก ๋คํธ์ํน | Alamofire + Router ํจํด |
๐ฆ DB | RealmSwift + Repository ํจํด |
๐จ UI | UIKit SnapKit Kingfisher |
๐ Code Convention | SwiftLint |
๐ธ ๊ธฐํ | WebKit Then |
- ์ธ๊ธฐ์ํ&์๋ฆฌ์ฆ ์ดํด๋ณด๊ธฐ
- RxDataSources๋ฅผ ํ์ฉํ ๋ค์ค ์น์ ์ปฌ๋ ์ ๋ทฐ ๊ตฌ์ฑ
- ์ํ&์๋ฆฌ์ฆ ์ค์๊ฐ ๊ฒ์ ๋ฐ ์ถ์ฒ ์ปจํ
์ธ ์ ๊ณต
- RxSwift์ ์คํผ๋ ์ดํฐ๋ฅผ ํ์ฉํ API ๊ณผํธ์ถ ๋ฐฉ์ง
- ์ํ&์๋ฆฌ์ฆ ์์ธ์ ๋ณด ์ ๊ณต ๋ฐ ๋น์ทํ ์ปจํ ์ธ ์ถ์ฒ
- ์ํ&์๋ฆฌ์ฆ ์๊ณ ํธ ์ฌ์
- WebKit์ ์ฌ์ฉํ ์ ํฌ๋ธ ํ๋ ์ด์ด ์ฌ์
- ์ํ&์๋ฆฌ์ฆ ์ฆ๊ฒจ์ฐพ๊ธฐ
- Realm Database + FileManager ๋ก ๋ก์ปฌ์ ์ํ์ ๋ณด ์ ์ฅ
- DTO๋ฅผ ํตํ API ๋ชจ๋ธ๊ณผ Presentation ๋ชจ๋ธ์ ๋ถ๋ฆฌ
- RxDataSources์ CompositionalLayout์ ํ์ฉํด ๋ฉํฐ ์น์ ์ปฌ๋ ์ ๋ทฐ ๋์
- Realm Database ์ ๊ทผ ์ Repository ํจํด์ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ์ ๋ณด ๋ก์ปฌ ์ ์ฅ
- ํฌ์คํฐ ์ด๋ฏธ์ง ๋ก์ปฌ ์ ์ฅ์ ์ํด FileManager ์ฌ์ฉ
- jpegData ๋ฉ์๋๋ฅผ ํตํ ์ด๋ฏธ์ง ์์ถ ๋ฐ ์ฉ๋ ์ต์ ํ
- RxSwift์ debounce์ distinctUntilChanged๋ฅผ ํ์ฉํ API ๊ณผํธ์ถ ๋ฐฉ์ง
- ํ์ ์ผ๋ก์จ์ protocol๊ณผ extension์ ์ฌ์ฉํ UIView์ identifier ๊ด๋ฆฌ
- Protocol์ ์ฌ์ฉํด ViewModel์
Input-Output
๊ตฌ์กฐํ - String Catalog์ String Extension์ ํ์ฉํ ๋ค๊ตญ์ด ๋์ (์์ด, ํ๊ตญ์ด)
- RxNotification์ ํตํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ค์๊ฐ ๊ฐ์ง ๋ฐ UI ์ ๋ฐ์ดํธ
- Single ํ์ ๊ณผ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ๋คํธ์ํฌ ์ถ์ํ ๋ฐ ์ฌ์ฌ์ฉ์ฑ ํฅ์
- sectionProvider๋ฅผ ํตํด sectionIndex์ ๋ฐ๋ฅธ ๋ถ๊ธฐ ์ฒ๋ฆฌ
- AnimatableSectionModel ํ์ ์ ์น์ ๋ชจ๋ธ ์์ฑ
- RxCollectionViewSectionedAnimatedDataSource๋ฅผ ๊ตฌ์ฑํด Data Binding
- "At least 1 subitem is required for a group" ์๋ฌ ๋ฐ์
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [])
- ์ ์์ด ํค๋๋ง ์ฌ์ฉํ๊ธฐ ์ํด subitems๊ฐ ์๋ NSCollectionLayoutGroup์ ์ฌ์ฉํ ๊ฒ์ด ๋ฌธ์ ๊ฐ ๋จ
- heightDimension์ 0.01๋ก ์ค์ ํ NSCollectionLayoutItem์ subitems์ ์ถ๊ฐํด์ค์ผ๋ก์จ ํด๊ฒฐ
- ๋ค๋น๊ฒ์ด์ ๋ฐฉ์์ ๋ํ ์์ฌ์ํต ๋ถ์ฌ ์ฌ์ ์ ๊ณตํตํ๋ฉด์ ๋ํ ํ๋ฉด์ ํ์ ํต์ผํ์ง ์์ ํ๋ฉด์ด ๋์ง ์๋ ์ค๋ฅ ๋ฐ์. ํ๋ฉด์ ํ ๊ฐ์ ๋ถ๋ถ๋ค๋ ์ฌ์ ํฉ์๋ฅผ ํตํด ์์ ์ฌํญ์ ์ค์ผ ์ ์๋ค๋ ์ ์ ๊นจ๋ฌ์
- Realm ๋ชจ๋ธ์ ๋ํ ๊ณตํตํฉ์ ๋ถ์กฑ ํ๋ก์ ํธ ์ค์ Realm ๋ชจ๋ธ์ ๋ณ๊ฒฝ์ ์ด ๋ฐ์. ๊ด๋ จ๋ ๋ก์ง์ ๋ชจ๋ ์์ ํ๊ณ Conflict๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ์ด๋ฐ ๋ชจ๋ธ ์ค๊ณ์ ์ค์์ฑ์ ๊นจ๋ฌ์
- FileManager ์ฌ์ฉ ์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ๋ถ๋ถ์ ํธ๋ค๋ง์ด ๋์ด์์ง ์์ ์์ฌ์. ์ถํ ์๋ฌ ํธ๋ค๋ง์ ๋ํ ๋ถ๋ถ์ด ๊ฐ์ ๋์์ผ๋ฉด ์ข๊ฒ ์