๊ฐ๋ฐ, ๊ธฐํ, ๋์์ธ: @yeaghdev
-
์์ดํฐ์์ ๋ค๋ฅธ ๊ตญ๊ฐ์ ์ฑ์คํ ์ด๋ฅผ ๊ตฌ๊ฒฝํ๊ธฐ ์ํด์๋ 8๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผํฉ๋๋ค.
-
''์ ์ธ๊ณ ์ฑ์คํ ์ด์ ์ฑ์ ์ข ๋ ๊ฐํธํ๊ฒ ๊ฒ์ํ๊ณ , ๋ชจ์๋ณผ ์ ์๋ ์ฑ์ด ์๋ค๋ฉด ๋ฒ๊ฑฐ๋ก์์ ๋์ด์ค ์ ์๊ฒ ๋ค!''์์ ์์ํ์ต๋๋ค.
-
๊ตญ๊ฐ, OS(iPhone, iPad,) ์ ํ -> ๊ฒ์, 2๋จ๊ณ๋ง ๊ฑฐ์น๋ฉด ๋ฐ๋ก ๋ด๊ฐ ๋ณด๊ณ ์ถ์ ๊ตญ๊ฐ์ ์ฑ์ ๊ฒ์ํ ์ ์์ต๋๋ค.
-
์ถํ ์ฑ ์คํ ์ด ๋ฐฐํฌ๋ฅผ ๋ชฉํ๋ก ์ถ๊ฐ ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ฐ ๋ณด์ ์ค์ ๋๋ค.
-
Swift
-
UI : UIKit(code base UI), AutoLayout
-
Network : URLSession, RESTAPI
-
Database : RealmSwfit
-
Reacive Programming: Combine
-
์์กด์ฑ ๊ด๋ฆฌ ํด : SPM
- Swift Style Guide, API Design GuideLine๋ฅผ ๋ฐ๋ฆ ๋๋ค.
๋์ ์ด์
- Mssive ViewController์ ์ญํ ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด MVVM ์ฌ์ฉ
- ์ ํ๋ฆฌ์ผ์ด์ ์ญํ ์ ๋น์ฆ๋์ค ๋ก์ง, ๋ฐ์ดํฐ Repository, Database, API๋ก ์๊ฒ ๋ถ๋ฆฌํ๊ณ , ์์กด์ฑ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ํด๋ฆฐ์ํคํ ์ฒ๋ฅผ ์ญํ ๋ถ๋ฆฌ ๋ชจ๋ธ๋ก ์ ํ
- ๋ ์ด์ด์ ๋จ๋ฐฉํฅ ์์กด์ ํ ์คํธ ์์ฑ์ ์ฉ์ด
- ๊ฐ์ฅ ๋ง์ด ๋ณ๊ฒฝ๋๋ View๋ ๋ ์ด์ด์ ์ต์ธ๊ณฝ์ ์์นํ๋ฏ๋ก UI ๋ณ๊ฒฝ ์๊ตฌ์ฌํญ์ ๋์ํ๊ธฐ ์ฌ์
์ญํ ์ ์
- View : UI, ๋ ์ด์์์ ๊ตฌ์ฑ, ViewModel์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์, ์ฌ์ฉ์ ์ก์ ์ ViewModel์ ์ ๋ฌ
- ViewModel : Usecase๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ UI์ ํ์ํ๋ ํํ๋ก ๋ณํ, ์ฌ์ฉ์ ์ก์ ์ ๋ฐ๋ฅธ ๋น์ฆ๋์ค ๋ก์ง์ Usecase๋ฅผ ์ฌ์ฉํด ์คํ
- Usecase : ์ฑ์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํ, Repositry Layer๋ก๋ถํฐ ์ป์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ๋ก ๋ณํํด์ ์ฌ์ฉ
- Repository : APIService ๋๋ Realm์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ํ์น, ์์ , ์ญ์ , ์ ์ฅํ๋ ์ญํ ์ ๊ตฌํ
๊ฒฐ๊ณผ
-
์ฅ์
- ์ญํ ์ ์๊ฒ ์ ์งํจ์ผ๋ก์ ๊ธฐ๋ฅ์ ํ์ฅ, ์ ์ง๋ณด์์ ์ฉ์ด
- ๊ฐ ๋ ์ด์ด๋ณ ํ ์คํธ ์ํํ๊ธฐ ์ฉ์ด
- ์ฝ๋์ ์์ง์ฑ์ ๋๊ฒ, ๊ฒฐํฉ๋๋ ๋ฎ๊ฒ ์ค๊ณ๋์ด์์ผ๋ฏ๋ก ๋ณ๊ฒฝ์ฌํญ์ด ์์ ๋ ์ ์ ์์ ์ฝ๋๋ง ์์ ํ๋ฉด ๋จ
-
๋จ์
- ๊ฐ๋ฐ ๋น์ฉ(์๊ฐ, ํ์ผ ๊ฐ์)์ ์ฆ๊ฐ
- ๋น์ฆ๋์ค ๋ก์ง์ ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋๋ฐ ๋ชจ๋ ๋ ์ด์ด์ API๋ฅผ ์ค๊ณํด์ผํ๋ฏ๋ก ๊ฐ๋ฐ ๋น์ฉ์ด ์ปค์ง
- ๋ด๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌํ ํ๋ ์์ํฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค๋ฉด RepositoryLayer์ Repository๊ตฌํ์ฒด ๋ถ๋ฆฌ๋ ์ค๋ฒํค๋๋ผ๋ ์๊ฐ์ด ๋ค์์
๋์ ์ด์
- ๋ทฐ ์ปจํธ๋กค๋ฌ ์์ ๋ทฐ ์์ฑ ๋ฐ ํ๋ฉด ์ ํ ๋ก์ง์ด ๋ถ์ฐ๋์ด ์์ด ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์
- ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ์ ๊ฒฐํฉ์ด ์๊น
๊ฒฐ๊ณผ
-
์ฅ์
- ํ๋ฉด ์ ํ ๋ก์ง์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์์
- ์ฌ๋ฌ ํ๋ฉด์ ํ์ ํ๊บผ๋ฒ์ ๊ด๋ฆฌ ๊ฐ๋ฅ
-
๋จ์
- ๋ทฐ์ปจ ๊ฐ์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋ณต์กํด์ง
- ๊ฐ๋จํ ์ ํ์ ์ํด์๋ ์์ฑํ๋ ํ์ผ๋ค์ด ๋ง์
๋์ ๊ณผ์
- Realm์ CRUD ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๋น๋๊ธฐ๋ก ์คํํ๊ณ ์ถ์์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก mainQueue์์ ์์ ์ ํ๋๋ก ์ง์ ํ์ง๋ง, mainQueue๋ UI์์ ์ ํ๋๋ก ๊ณต๊ฐ์ ๋จ๊ฒจ์ฃผ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
- serialQueue๋ฅผ ์์ฑํ์ฌ, ํ์์ ๋น๋๊ธฐ๋ก ์์ ์ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํํ์ต๋๋ค.
- ๋น๋๊ธฐ๋ก ์์ ์ด ์๋ฃ๋ ๋ค์ ํ์ ์์ ์ ํ ์ ์๋๋ก ํ์ถํด๋ก์ ๋ฅผ ์ธ์๋ก ๋ฐ์์ผ๋, ์ด๋ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํค์น๊ณ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
withCheckedThrowingContinuation
์ ์ฌ์ฉํด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ฐ์ธ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์์๋async/await
์ ์ฌ์ฉํด ๋๊ธฐ์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.- RealmObject๋ ์์ฑ ์ค๋ ๋์์๋ง ์ ํจํ๋ฏ๋ก, Repository์์ ๋ด๋ณด๋ผ ๋๋ ๋๋ฉ์ธ ๋ชจ๋ธ(๊ตฌ์กฐ์ฒด)๋ก ๋ณํ์์ผ ์ฌ์ฉํ์ต๋๋ค.
๊ฒฐ๊ณผ
- DB์ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๋ฅผ ๋ถ๋ฆฌ์ํฌ ์ ์์์ต๋๋ค.
- ๊ตฌ์กฐ์ฒด๋ก ํ์ ์ ๋ณ๊ฒฝํจ์ผ๋ก์จ Concurrency ํ๊ฒฝ์์ ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์์ต๋๋ค.
- ๊ฐ๋ ์ฑ์ด ํฅ์๋์์ต๋๋ค.
- UI์
๋ฐ์ดํธ๋ฅผ ์ํด
Task
๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์์๋ ์ฝ๋ ์ธ๋ดํธ๊ฐ ๊น์ด์ก์ง๋ง, ํ์ถ ํด๋ก์ ์ฌ์ฉ์ผ๋ก ์ธํ ๊ฐ๋ ์ฑ ์ ํด๋ณด๋ค๋ ๋ซ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋์ ๊ณผ์
- Usecase์์ ์ฌ์ฉํ๊ธฐ ์ , DB์์ ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋์ง ํ ์คํธํ๊ณ ์ถ์์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
Realm
๊ณผserialQueue
๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ง๋RealmStore
๋ฅผ ์ฃผ์ ๋ฐ์RealmAppFolderRepository
๋ฅผ ์์ฑํ๋๋ก ๊ตฌํํ์ต๋๋ค.- Test์์๋ InMemory Realm์ผ๋ก ์ค์ ํ
RealmStore
๋ฅผ ์ฌ์ฉํด ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํด ๋ณผ ์ ์์์ต๋๋ค.
๋์ ๊ณผ์
- ์ฑ ์ฌ์ฉ์ ํ์ ์ ๋ํ๋ผ ๋ณ5๊ฐ์ ๋ทฐ๊ฐ ํ์ํ์ต๋๋ค.
- ํ์ ์ ๋ฐ๋ผ ๋ณ์ ์ฑ์ธ ์ ์๋๋ก ๋ทฐ๋ฅผ ๊ตฌํํด์ผํ์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
- ๋ณ 5๊ฐ๋ฅผ ๊ฐ๊ฐ
UIView
๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํ์ต๋๋ค. - ํ์ง๋ง
UIView
๋ Mainthread์์ CPU๋ฅผ ์ฌ์ฉํ๊ณ ,CALayer
๋ GPU๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์CALayer
๊ฐ CPUํ์ฉ, ์๋ต์ฑ ์ธก๋ฉด์์ ์ ๋ฆฌํ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค. - ๊ธฐ์กด์ ์๋ Cosmos ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ,
StarRatingView
์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ์ต๋๋ค. - ๋ณ์ ํฌ๊ธฐ, ์์, ๋ณ์ฌ์ด ๊ฐ๊ฒฉ์ Configuration์ผ๋ก ์ค์ ํ ์ ์๊ณ , ์ ๋ฌ ๋ฐ์ ๊ฐ์ ํด๋นํ๋ ๋ณ์ ์ ๊ทธ๋ ค๋ ๋๋ค.
๊ฒฐ๊ณผ
- ๋ณ์ ํฌ๊ธฐ, ์์, ๋ณ ์ฌ์ด ๊ฐ๊ฒฉ์ Configuration์ผ๋ก ์ค์ ํ ์ ์๊ณ , ์ ๋ฌ ๋ฐ์ ๊ฐ์ ํด๋นํ๋ ๋ณ๋ค์ ๊ทธ๋ฆฌ๋๋ก ๊ตฌํํ์ต๋๋ค. ๋ณ์ ๋์์ธ์ ์์๋ ์บก์ํํ๊ณ , ๋๋ก์ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ ์ง ๋ณด์์ ์ฉ์ด์ฑ์ ๋๋ ์ ์์์ต๋๋ค.
๋์ ๊ณผ์
- ๋ค์ํ ์ฌ์ด์ฆ์ ์คํฌ๋ฆฐ์์ ์์ ๋๋ ๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ํ์ดํ๋ฅผ ๊ตฌํํ๊ณ ์ถ์์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
UIBezierPath
๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํ๊ณ ,CAKeyframeAnimation
์ ์ฌ์ฉํด ํธ๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ์ต๋๋ค.CAShapeLayer
๋ฅผ ์์ํAnimatableArrowLayer
๋ฅผ ๊ตฌํํด, ๋ค์ํ ์ฌ์ด์ฆ์ ์์์๋ ๋์ผํ ์ ๋๋ฉ์ด์ ์ ๋์ํ๋๋ก ํ์ ํํ์ต๋๋ค.
๊ฒฐ๊ณผ
- ์ ๋๋ฉ์ด์ ์์๋ฅผ ํ์ ํํจ์ผ๋ก์จ ๊ฐ๋ ์ฑ์ด ๋์์ก์ต๋๋ค.
- ์ญํ ์ ์๊ฒ ๋ถ๋ฆฌํ์ฌ ์์ง์ฑ์ด ๋์์ก์ต๋๋ค
๋์ ๊ณผ์
- ๋ฒ์ ์ ๋ฐ์ดํธ ๋ ธํธ, ์ฑ ์คํฌ๋ฆฐ ์ท, ์ฑ ์ค๋ช , ์ฑ ์ ๋ณด๋ฑ ๋ค์ํ ์ ๋ณด์ ๊ทธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ค์ํ ์คํ์ผ์ Cell์ ํ๋์ ๋ทฐ์ ๊ตฌ์ฑํด์ผํ์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
- CompositionalLayout์ ํ์ตํด ์น์ ๋ณ๋ก CustomCell, layout์ ์ ์ฉํ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
- ๊ฐ CustomCell๋ด๋ถ์์ ์ฌ์ฌ์ฉ๋๋ ๋ทฐ๋ CustomView๋ก ํ์ ์ ๋ถ๋ฆฌํด ์ฝ๋์ ๋ณต์ก์ฑ์ ๋์์ต๋๋ค.
- Custom Section Header๋ฅผ ๊ตฌํํ๊ธฐ ์ํด UICollectionReusableView๋ฅผ ์์ํ์ต๋๋ค.
๋์ ๊ณผ์
- ํ
์คํธ ํ๋์ input ์ฌ์ด์ฆ์ ๋ฐ๋ผ ๋ฒํผ์
isEnabled
์ํ๋ฅผ ์ ๋ฐ์ดํธํด์ผํ์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
- ๋ฐ์ํ UI๋ฅผ ๊ตฌํํ๊ธฐ ์ํด Combine์ ์ฌ์ฉํด UserEvent -> Input -> ViewModel -> Output -> UI์ ๋ฐ์ดํธ ๋จ๋ฐฉํฅ ํ๋ก์ฐ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๊ฒฐ๊ณผ
- UI๋ฅผ ์ธ์ ์ด๋ป๊ฒ ๋ฐ๊ฟ์ง์ ๋ํ ๋ก์ง์ ๋ทฐ๋ชจ๋ธ์ด ์ฒ๋ฆฌ, ๋ทฐ๋ ์๋์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ์ญํ ๋ง ์ํํ๋๋ก ๋ถ๋ฆฌํ ์ ์์์ต๋๋ค.
๋์ ๊ณผ์
- AppFolder์ ์ ์ฅ๋ SavedApp์ ๋ฐ์ดํฐ๋ก iTunes SearchAPI๋ฅผ ํธ์ถํ๊ณ , ๋ฐ์ Response์ SavedApp ๋ฐ์ดํฐ๋ฅผ ๋ณํฉํ์ฌ ๊ฐ ์ ์ ํ์ํด์ผ ํ์ต๋๋ค. ๋ฏธ๋ฆฌ ๋ชจ๋ SavedApp์ ๋ํ API ํธ์ถ์ ํ๊ณ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ ๋ค reloadData๋ฅผ ํ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๊ณ , ๊ธด ๋ก๋ฉ ์๊ฐ์ ์ด๋ํ๊ธฐ์ ์ข์ง ์์ ์ฌ์ฉ์ฑ์ ์ค ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
- Combine์ operator๋ฅผ ํ์ฉํด โ SavedApp์ผ๋ก iTunesAPI ํธ์ถ โก๏ธ SavedApp๊ณผ Response๋ฅผ ๋ณํฉํด CellModel๋ก ๋ณํ โก๏ธ Cell์์ ๊ตฌ๋ โ ํ๋ ์คํธ๋ฆผ์ ๋ง๋ค์์ต๋๋ค.
- cellForRowAt์์ ์คํธ๋ฆผ์ ์์ฑํ ํ cell์์ ๊ตฌ๋ ํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ด๋ถ์์ ์ ๋ฐ์ดํธ ํ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
๊ฒฐ๊ณผ
-
์ ์ด ๋ํ๋์ด ํ์๋ ๋ ์คํธ๋ฆผ์ด ์์๋๋ฏ๋ก ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ฆ๊ฒ ํ์๋๋ ์ง์ฐ์ด ๋ฐ์ํ์ต๋๋ค.
-
UITableViewDataSourcePrefetching
์ผ๋ก ์ ์ด ๋ํ๋๊ธฐ์ ๋ฏธ๋ฆฌ ์คํธ๋ฆผ์ ์คํ์์ผ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์ ํ, ํด๋น ๋ฐ์ดํฐ๋ก ๋ฐ์ธ๋ฉํ ์ ์๋๋ก ๊ฐ์ ํ์ต๋๋ค. (#24)
- ๋ค๊ตญ์ด ์ง์(ํ๊ตญ์ด/์์ด)
- ๊ณต์ ๊ธฐ๋ฅ ์ถ๊ฐ (์ฑ ์คํ ์ด ๋งํฌ ๋ด๋ณด๋ด๊ธฐ)
- ๋คํธ์ํฌ ์ฒด์ปค
- ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ผ๋ก ๋ณ๊ฒฝ