Naver news ๊ฒ์ API๋ฅผ ํ์ฉํ iOS ์ดํ๋ฆฌ์ผ์ด์ .
- ์ต์ ํ๊ฒ : iOS 14.5
- CleanArchitecture + MVVM-C ํจํด ์ ์ฉ
- CoreData ํ๋ ์์ํฌ ์ฌ์ฉ์ผ๋ก ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ชฉ๋ก ์ ์ง
- Storyboard๋ฅผ ํ์ฉํ์ง ์๊ณ ์ฝ๋๋ก๋ง UI ๊ตฌ์ฑ
- Pagination ๊ตฌํ
- Unit Test ์งํ
- ๊ฐ๋ฐ ๊ณต์
- ๊ธฐ์ฌ ๊ฒ์ ๋ทฐ
- ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ธฐ์ฌ ๊ฒ์ ๊ธฐ๋ฅ
- ํ์ด์ง๋ค์ด์ - prefetching ๋ฐฉ์
- refreshing ๊ธฐ๋ฅ
- ํ๊ทธ ์ค์ ๋ทฐ
- Compositional layout์ ํตํ self-sizing CollectionView
- delegate ํจํด์ ํตํ ๋ฐ์ดํฐ ์ ๋ฌ
- ๋ํ
์ผ ์น ๋ทฐ
- ์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ๊ฐ/์ ๊ฑฐ
- ์กํฐ๋นํฐ ์ธ๋์ผ์ดํฐ
- WebView ๊ธฐ๋ฐ ์ฐ๊ฒฐ
- ๋งํฌ ํด๋ฆฝ๋ณด๋ ๋ณต์ฌ
- ์คํฌ๋ฉ ๋ทฐ
- ์คํฌ๋ฉ ๋ชฉ๋ก ๊ด๋ฆฌ
- ์คํฌ๋ฉ ๋ฐ์ดํฐ ์ ๊ฑฐ
Swift, MVVM+C, CI/CD, Unit Test, CoreData, WebKit, SnapKit, Alamofire, Toast-swift, TTGTagCollectionView, RxCocoa, RxSwift, RxTest
์ฒ์ ์ฝ๋๋ค์ดํฐ ํจํด์ ๊ตฌ์ฑํ๋ค ๋ณด๋ ์ดํดํ๋๋ฐ ๊ฝค ์๊ฐ์ด ๋ค์๋ค. ์์ฑ์ ์ฃผ์
์ ํตํด navigationController๋ฅผ ์ฃผ์
๋ฐ๊ณ , ํ๋ฉด์ ํ ์ ํด๋น navigationController
๊ฐ ๋ค์ ํ๋ฉด์ push ํ๋๋ก ๊ตฌ์ฑํ๋ค. ํ์คํ ์ง์ ์ ์ธ ViewModel
์์์ ViewController ์์ฑ๊ณผ DI๋ฅผ ํผํ๊ณ Container๋ฅผ ํตํด์ ํ๋ค๋ณด๋ View ์์ฒด์์๋ Model์ ๋ํด์ ๋์ฑ ์ ์ ์๋๋ก ๊ตฌ์ฑํ๋ค๋ ์ ์์ ๋ง์กฑ์ด๋ค. ์กฐ๊ธ ์๋ฌธ์ ์ ํ๋ฉด์ ํ ๋์์ ํด๋ก์ ํ์
์ผ๋ก actions์ ์ ์ฅํ๊ณ , actions๋ฅผ ViewModel์ init ์ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํด๋ด์ผ ํ ๊ฑฐ ๊ฐ๋ค.
ViewModel์ unit test์ ์์ด์ ์ต๋ํ coverage๋ฅผ ๋ง์กฑ์ํฌ ๊ฒ์ ๊ณ ๋ คํ๊ณ ํ์์ ๋ฐ๋ผ BDD์ฒ๋ผ ์กฐ๊ฑด ๋ถ๊ธฐ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํตํ์ฌ ํ ์คํธ ์ผ์ด์ค ๋ถ๋ฆฌํ๋ค. ํ ์คํธ ๊ตฌ์ฑ์ ์์ด์ MVP ํจํด์ Presenter์ ๋น๊ตํ ๊ฒฝ์ฐ ์ปค๋ฒ๋ฆฌ์ง๋ ์๋นํ ๋์ ์ ๋ฐ์ ์์๋ค. ํ์ง๋ง, In/Out ํจํด์ ๋ํ ์๊ฐ๊ณผ ์ ๋ฐ์ ์ธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์๋ ๊ตฌ์ฒด์ ์ธ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ๊ณ ๋ฏผํ๊ฒ ๋์๋ค.
Test์์ In/Out์ ์ ํ์ ๊ณผ ํ ์คํธ๋ฅผ ์๋๋ฆฌ์ค์ ๋ฐ๋ผ ๋ถ๋ฆฌ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ณ ๋ฏผ
๋ด๋ถ ๊ตฌ์กฐ์ฒด์ ์ฝ๋งค์ด๋ค ๋ณด๋ ์ ์ฒด์ ๋ํ Default Input ์ด๋ฒคํธ๋ฅผ ๊ตฌ์ฑํด์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋์๋ค. ์ ๋ฐ์ ์ธ ํ ์คํธ ์ํ์ ์์ด์๋ ์ฅ์ ๋ ์์์ง๋ง ์คํธ๋ฆผ์ ๋ถ๊ธฐ ๋จ์ ๋ณ๋ก ์๋๋ฆฌ์ค์ ๋ง์ถฐ ๊ตฌ์ฑํ๋ ๋ฐ ์ ์ฝ์ด ์์๋ ๊ฑฐ ๊ฐ๋ค. ๋ฐ๋ผ์, ๋ถ๋ฆฌํด์ ์ ์ํ ์คํธ๋ฆผ์ ์ ๋ฌํ๋ ๋ฐฉ์๊ณผ ํน์ ๋ชจ๋ธ ๋จ์๋ณ๋ก ๋ถ๋ฆฌํด์ ๋ด๋ถ์ ๋ก์ง๋ง ํ์ธํ๋๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํด๋ด์ผํ๋ค.
์ํคํ ์ณ์ ์ง์คํ์ฌ ์์ฃผ ์์ ์์ค์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๋ณด๋ ๋ณต์กํ ์์ค์ ๊ธฐ๋ฅ์ด ์์ด์ ๊ตฌํ์๋ ํฐ ์ด๋ ค์์ด ์์๋ค. ํ์ง๋ง, ์ค์ ํ๋ก์ ํธ์์ ๋ณต์กํ ๋ทฐ๋ ๊ธฐ๋ฅ ๊ตฌํ๊ณผ ๋ทฐ์ ์ ๋๋ฉ์ด์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๊ณ ๋ คํ์ฌ ๋ค์ ํ๋ก์ ํธ ๋์๋ ์กฐ๊ธ์ ๋ ์ ๊ฒฝ ์จ๋ด์ผ๊ฒ ๋ค. UI Test๋ ํฌํจํด์ ๋ง์ด๋ค.
Signal, Drive ๋ฑ์ Traits๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ค. ํ์ง๋ง ๊ตฌ์ฑํ๋ฉด์ ์๋ฌธ์ด ์๊ธด ๊ฑด emit(), drive() ๋ฑ onNext ๋ด๋ถ์ ๋ก์ง์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์๋ ์ธ๋ถ๋ก ์ ๋ฆฌํด์ ๋ถ๋ฆฌํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ํ์คํ ViewModel์ด ๋๋ฉด์ ์ฝ๋์ ์์ ์ค์์ง๋ง, ์ฝ๋์ ํ๋ฆ์ ํ์คํ ๋ณด๊ธฐ ์ํด์ ๋ง์ด๋ค. ๊ฐ๋ ์ฑ์ ์ธก๋ฉด์์๋ ๊ต์ฅํ ์์ ์ฝ๋์ ๋นํด์ ๊ฐ์ ์ด ๋ง์ด ๋์๋ค.
Operator ํ์ฉ์ ์์ด์๋ ๊ธฐ์กด์ ํํ ๋ฆฌ์ผ ๋ณด๋ค ์ ํ์ ์ธ ์์ค์ ์์กดํ ๋๋์ด ๊ฐํด์ UI ์ธํฐ๋ ์ , ๋ฐ์ดํฐ ํํฐ ๋ฑ ๊ตฌ์ฒด์ ์ผ๋ก ํ์คํ๊ฒ ์ด ์์ ๋ค์ ์ฐธ๊ณ ํ์ฌ ์ฌ์ฉ์ฑ์ ๋ํด์ ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ๋ค. ๋จ์ํ ์ฌ์ฉ์ด ์๋ ํํฐ, ํฉ์ฑ, take ๋ฑ ๊ณ ๋ คํ ๋ถ๋ถ์ ์ต์ ์ฒ๋ผ ํ์ฉํ ์ ์์ ๋ ๊น์ง ์ฐ์ต์ ๋ ํด๋ด์ผํ ๊ฑฐ ๊ฐ๋ค. ์ข์ ๊ธฐ๋ฅ์ด ๋ง์๋ฐ ๋ค ๋ชป ์ฐ๋ ๋๋์ด ํฌ๋ค.
Delegate, Closure๋ฅผ ํตํ Scene ์ฌ์ด์์์ ์งง์ ๊ฑฐ๋ฆฌ ์์ค์ ์ ๋ฌ๊ณผ Notification์ ํตํ ๊ธด ๊ฑฐ๋ฆฌ ์์ค์ ์ ๋ฌ์ ๋ํ ๊ณ ๋ฏผ์ ํญ์ ํ๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฒ์๋ ํค๋ ๋ถ๋ถ์ ์๋ ํํฐ์ ์์กดํ๋ฉด์ ํ๋ค ๋ณด๋ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ๋ฌ์ ์์ด์๋ delegate๋ฅผ ํ์ฉํ์๋๋ฐ ์ฐ๋ฉด์ ์ํ ์ฐธ์กฐ๋ฅผ ์ ๊ณ ๋ คํด์ผํ ๋ฏ, Delegate๋ฅผ ์ฌ์ฉํ ๋์ ํญ์ AnyObject๋ฅผ ์ ๋ฌ์! Delegate property๋ weak๋ก ์ ์ธํด์ผ ํ๋ค!
RxSwift๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ์ง๋ง. ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ ์ผ๋ฐ ํ์ ์ผ๋ก ์ ๋ฌํ๊ณ ํด๋น ์คํธ๋ฆผ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ผ๋ก ํ์ฌ๋ ๊ตฌ์ฑํด์๋ค. ์๋ฌด๋๋ ๋จ์ผ API ํธ์ถ๊ณผ ๊ด๋ จํ์ฌ ๊ฐ๋ณ๊ฒ ์ฌ๊ธฐ๊ณ ์์ ์ ์งํํ ์ ์ด ๊ฐ์ฅ ํฌ์ง ์์๊น? ๊ทธ๋์ Moya ๋ฑ์ ์๋ํํฐ๋ฅผ ์ฌ์ฉํ์ ๋๊ฐ ์๊ฐ์ด ๋ฌ๊ณ , ์ฌ๋ฌ ๊ฐ์ API ํธ์ถ ์์ ์ฐ๋ ๋ ๊ด๋ฆฌ์ ํด๋น case ๊ด๋ฆฌ๋ฅผ ๋ณด๋ค ํธํ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผ ์ค์ด๋ค. ์ด๊ฑฐํ์ด ์๋ API๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ์ฒด ํ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ ๋๋ก ์ฝ๋์ ์ง ๋ณด์๊ฐ ์ฉ์ดํ๋๋ก ๋ณด์ํด๋ณด๋ ๋ฐฉ์๋ ๋์์ง ์์ ๋ฏ
์ด๋ฒ ๊ณ๊ธฐ๋ก ์ค์ Robert C. Martin ์ Clean Arichitecture๋ฅผ ์ฝ์ด๋ณด๊ณ swift ํํ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฅ ์ ๋ช ํ ์์ ๋ ํฌ๋ฅผ ์ฐธ๊ณ ํ๋ค. ํ์คํ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ ๋ํ ํด์๋ฅผ ํตํด์ ์ํคํ ์ณ ๊ตฌ์ฑ์ ๋ํ ์๊ฐ์ ๋ง์ด ํ๋ค. Ribs, Viper ๋ฑ ๋ณด๋ค ๊ณ ๋จ๊ณ๋ก ์ ๋ฆฝ๋ ์ญํ ์ ๋ํด์๋ ํ ๋ฒ ํํ ๋ฆฌ์ผ์ ์งํํด์ผํ ๋ฏ
์์ฌ์ด ๋ถ๋ถ์ ์ ๋ง๋ก Clean ์์ค์ ์ ๋๊ฐ ์ด๋๊น์ง์ธ๊ฐ? ํ๋ ์๋ฌธ์ด๋ค. ๋ ์ด์ด์ ๋ถ๋ฆฌ์ ์์ญ ๊ตฌ์ฑ์ ์์ด์ ์์ง์ ์ถ์ํ๊ฐ ๋ง์ด ๋ถ์กฑํ๋ค. ์กฐ๊ธ ๋ ๋ฐ์ดํฐ ํ๋ก์ฐ์ ๋ํด์ ๋ ๊น์ ์ดํดํ๋๊ฒ ์ค์ํ ์์ ์ด๋ค.