๐ ์ง์ง ๋ง์๋ ํ๋ฒ๊ฑฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์ ์ ๋ค๊ณผ ํจ๊ป ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ์ฌ ์ง๋๋ฅผ ์ฑ์๋๊ฐ๋ ์ฑ
-
์ง๋ ๊ธฐ๋ฐ ๋ฆฌ๋ทฐ ํ์ธ
- ์ฌ์ฉ์๋ ์ง๋๋ฅผ ํตํด ์ฃผ๋ณ ํ๋ฒ๊ฑฐ ๋ง์ง์ ํ์ํ๊ณ , ํด๋น ์๋น์ ์์ฑ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์๋น ์์น๋ฅผ ๋ํ๋ด๋ ํ์ ์ ํํ๋ฉด, ๋ฆฌ๋ทฐ์ ํจ๊ป ์ด๋ฏธ์ง๋ฅผ ์์์ ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
-
๋ฆฌ๋ทฐ ์์ฑ ๋ฐ ์ํธ์์ฉ
- ์ฌ์ฉ์๋ ํ ์คํธ์ ์ด๋ฏธ์ง๋ก ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธฐ๋ฉฐ, ๋ฆฌ๋ทฐ์ ๋ํด ์ข์์ ํน์ ๋ถ๋งํฌ๋ฅผ ํตํด ์ํธ์์ฉ์ ํ ์ ์์ต๋๋ค.
- ์์ฑ๋ ๋ฆฌ๋ทฐ์ ๋๊ธ์ ๋จ๊ฒจ, ๋ค๋ฅธ ์ฌ์ฉ์๋ค๊ณผ ์ํต์ด ๊ฐ๋ฅํฉ๋๋ค.
-
ํ๋ก์ฐ ๋ฐ ์ ์ ํผ๋
- ์ํ๋ ์ ์ ๋ฅผ ํ๋ก์ฐํ ์ ์๊ณ , ํ๋ก์ฐํ ์ ์ ๋ค์ ํ๋กํ์ ๋ฐฉ๋ฌธํ์ฌ ์ต์ ๋ฆฌ๋ทฐ๋ฅผ ํผ๋์์ ์์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
-
๋ค๊ตญ์ด ์ง์
- ํ๊ตญ์ด, ์์ด, ์ผ๋ณธ์ด๋ฅผ ์ง์ํ๋ฉฐ, ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ์ค์ ๋ ์ธ์ด์ ๋ง์ถฐ ์๋์ผ๋ก ์ค์ ๋ฉ๋๋ค.
-
์ง๋ ๊ธฐ๋ฐ ๋ฆฌ๋ทฐ
- Mapkit์ MKMapViewDelegate ํ์ฉํด ์ฌ์ฉ์ ๋ฆฌ๋ทฐ๊ฐ ์๋ ํ๋ฒ๊ฑฐ ์๋น ์์น๋ฅผ ์ง๋์ ํ์ํ์ต๋๋ค.
- Custom MKAnnotationView๋ฅผ ์ฌ์ฉํด Pin์ ๋ชจ์์ ํ๋ฒ๊ฑฐ ์์ด์ฝ์ผ๋ก ์ปค์คํฐ๋ง์ด์งํ์ฌ
์ฌ์ฉ์๊ฐ ํ๋์ ์์น๋ฅผ ์ธ์ํ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
-
ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๋ก๋ฉ
- ์ ์ฒด ๋ฆฌ๋ทฐ๋ฅผ ์กฐํํ๋ ๊ฒฝ์ฐ, Cursor Based Pagination์ ํตํด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ก๋ํ๋๋ก ๊ตฌํํ์ต๋๋ค.
-
์ด๋ฏธ์ง ๋ฐ์ดํฐ ์ ๋ก๋
- ๋ฆฌ๋ทฐ ์์ฑ ์ ์ด๋ฏธ์ง์ ํ
์คํธ๋ฅผ ํจ๊ป ์๋ฒ์ ์ ์กํ๊ธฐ ์ํด HTTP Request(Post)์ Content-type์
multipart/form-data๋ก ์ค์ ํ์์ผ๋ฉฐ, ์ด๋ฏธ์ง๋ฅผ JPEG๋ก ์์ถ ํ HTTP Request์ Body์ ํฌํจํ์ฌ
์๋ฒ์ ์ ๋ก๋ํ์์ต๋๋ค.
- ๋ฆฌ๋ทฐ ์์ฑ ์ ์ด๋ฏธ์ง์ ํ
์คํธ๋ฅผ ํจ๊ป ์๋ฒ์ ์ ์กํ๊ธฐ ์ํด HTTP Request(Post)์ Content-type์
- ์ธ์
- iOS 1๋ช
- ๊ธฐ๊ฐ
- 2024.08.14 - 2024.09.01 (์ฝ 19์ผ)
- ๋ฒ์
- iOS 15.0 +
-
ํ์ฉ๊ธฐ์
- UIKit, Mapkit
- MVVM, Input-Output, Clean Architecture
- CodeBasedUI
- Cursor Based Pagination
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ฌ์ฉ๋ชฉ์ |
---|---|
RxSwift | ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ, ์ฝ๋ ๊ฐ๋ ์ฑ ํฅ์ ๋ฐ ์ผ๊ด์ฑ ์ ์ง |
RxCocoa | UI์ ๊ด๋ จ๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ, ์ฝ๋ ๊ฐ๋ ์ฑ ํฅ์ ๋ฐ ์ผ๊ด์ฑ ์ ์ง |
RxDataSources | RxSwift ๋ฐ RxCocoa์ ํจ๊ป ์ผ๊ด์ฑ์๋ ์ปดํฌ๋ํธ ๊ตฌ์ฑ |
RxGesture | RxSwift ๋ฐ RxCocoa์ ํจ๊ป ์ผ๊ด์ฑ์๋ Gesture ์ฒ๋ฆฌ |
RxCoreLocation | RxSwift ๋ฐ RxCocoa์ ํจ๊ป ์ผ๊ด์ฑ์๋ ์์น ๋ฐ์ดํฐ ๊ด๋ฆฌ |
Snapkit | CodeBasedUI๋ฅผ ์ข ๋ ํธํ๊ณ ๋น ๋ฅด๊ฒ ๊ตฌ์ฑ |
Moya | ์ถ์ํ๋ ๋คํธ์ํฌ ํต์ ํ์ฉ |
Toast | ๊ฐํธํ ํ ์คํธ ๋ฉ์์งUI ๊ตฌ์ฑ |
Lottie | ๊ฐํธํ๋ฉด์ ์ ์ ํ ์ ๋๋ฉ์ด์ ์ ์ฉ |
Tabman | ๊ฐํธํ๊ณ ๋น ๋ฅด๊ฒ Paging ํญ๋ฐ๋ฅผ ๊ตฌ์ฑ |
iamport-ios | WebView ๊ธฐ๋ฐ์ ๊ฐํธ๊ฒฐ์ ์ ์ฉ |
IQKeyboardManagerSwift | ํค๋ณด๋ ์ฒ๋ฆฌ ํ์ฉ |
Kingfisher | API ์ด๋ฏธ์ง ์ฒ๋ฆฌ |
MVVM(Input/Output) + Clean Architecture
์ค๋ช
-
ViewModel (๊ด๋ จ์ฝ๋)
- RxSwift์ RxCocoa๋ฅผ ํ์ฉํ์ฌ ViewController์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๋ด๋นํ๋ ๊ณ์ธต
- Input๊ณผ Output์ ์ ์ํ์ฌ View์ ํต์ ์ ๊ด๋ฆฌ
- UseCase๋ฅผ ํตํด ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , UI ์ ๋ฐ์ดํธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต
-
UseCase (๊ด๋ จ์ฝ๋)
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๊ณ์ธต์ผ๋ก, ํน์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ๋ฐ ์ ๊ณตํ๋ ์ญํ
- Repository๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ๋ฐ ์ ๊ณต
- ๋คํธ์ํฌ ํต์ ์, RxSwift์ Single trait์ ํ์ฉ ๋ฐ Result ํ์
์ผ๋ก
ํ ๋ฒ ๋ ๋ํํ์ฌ error๊ฐ ๋ฐ์ํด๋ ๊ตฌ๋ ์ด ๋๊ธฐ์ง ์๊ณ Stream์ด ์ ์ง๋๋๋ก ๊ตฌํ
-
Repository (๊ด๋ จ์ฝ๋)
- Network์ API๋ฅผ ์์ฒญํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์ญํ ์ ๋ด๋น
- ์์ฒญ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ DTO๋ก ๋ณํํ์ฌ API์ ์์ฒญ
- ์๋ต์ ๋ํ DTO ๋ฐ์ดํฐ๋ฅผ Entity๋ก ๋ณํํ์ฌ UseCase์ ์ ๋ฌ
-
Network (Manager ๊ด๋ จ์ฝ๋ / Router ๊ด๋ จ์ฝ๋)
- Network Manager์ Network Router๋ฅผ ํ์ฉํ์ฌ ์ค์ง์ ์ผ๋ก ๋คํธ์ํฌ๋ฅผ ๋ด๋นํ๋ ๊ณ์ธต
- Network Manager: Moya์ MoyaProvider๋ฅผ ํ์ฉํ์ฌ ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด ์๋ต์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๊ฐ์ฒด
- Network Router: Moya์ TargetType์ ๋ ์ถ์ํํ ํํ์ TargetType์ ์๋ก ์ ์ํ์ฌ ์ฑํํ
enum์ case์ ์ฐ๊ด๊ฐ์ ํ์ฉํ์ฌ API์ BaseURL, HTTPMethod, Parameter, Header ๋ฑ์ ์ค์ - RequestDTO์ ResposeDTO๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ๋ฐ ์๋ต
-
Data Storage (๊ด๋ จ์ฝ๋)
- UserDefaults๋ฅผ ํ์ฉํ์ฌ Local DB๋ฅผ ๊ด๋ฆฌํ๋ ๊ณ์ธต
- ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์กฐํ
ํ์ ๋ชจ๋์ ํ๋กํ ์ฝ ํ์ ์ผ๋ก์ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ํ์ฌ ์์กด์ฑ์ ๋ฐฉํฅ์ ์ญ์ ์์ผฐ์ผ๋ฉฐ,
๊ทธ๋ก์ธํด ์ ์ง๋ณด์์ฑ์ด ํฅ์, Testableํ ์ฝ๋๋ฅผ ์์ฑ
- DIP๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ๊ณ์ธต ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋๋ก SOLID ์์น์ ๊ณ ๋ คํ๋ฉฐ ๋ชจ๋์ ๊ตฌํ
-
๋จ์ผ ์ฑ ์์ ์์น: ์ญํ ์ ๋ฐ๋ฅธ ๊ธฐ๋ฅ ๋ถ๋ฆฌ๋ก ์ธํ ๊ณ์ธต ๋ชจ๋ํ
(์: ์ก์ ์ ๋ด๋นํ๋ ViewModel, ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ UseCase, ์ธ์ฆ์ ๋ํ API๋ฅผ ๋ด๋นํ๋ Repository ๋ฑ๋ฑ) -
๊ฐ๋ฐฉ-ํ์์ ์์น: ์ถ์ํ๋ protocol์ ์ฑํํ์ฌ ์ธ๋ถ์์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ์๋๋ Class ๋ด๋ถ์์ privateํ๊ฒ ๊ตฌํ
-
๋ฆฌ์ค์ฝํ ์นํ ์์น: ViewController๋ฅผ ์์ Class๋ก ๋ฐ๋ผ๋ณด๋ฉฐ ๊ณตํต์ ์ผ๋ก ํ์ํ View(Navigation, Hierarchy, Layout, UI ๋ฑ) ์ค์ ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ ViewDidLoad์์ ํธ์ถํด ์์ Class์ธ ViewController์์
์ฌ์ ์ํด ๊ตฌํํ ์ ์๋๋ก ๊ตฌ์ฑ -
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น: Input, Output, UseCase, Repository ๋ฑ ์ญํ ์ ๋ฐ๋ฅธ ์์ ๋ชจ๋์์ ์ฌ์ฉ๋๋ ๋ฉ์๋ ๋ฐ
ํ๋กํผํฐ๋ง ์๊ตฌ์ฌํญ์ผ๋ก์ ํ๋กํ ์ฝ์ ์ ์ -
์์กด์ฑ ์ญ์ ์์น: ์์ ๋ชจ๋์ด ํ์ ๋ชจ๋์ ์์กดํ์ง ์๋, ์ถ์ํ๋ ํ๋กํ ์ฝ์ ์์กดํ๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋์ ๊ตฌํ
-
- ์ถ์ํ๋ ํํ์ ํ๋กํ ์ฝ๋ก Input๊ณผ Output์ ๊ตฌ์ฑํ์์ผ๋ฉฐ, ๋ ํ๋กํ ์ฝ์ ๋ณํฉํ ํํ๋ก typealias๋ฅผ ํตํด ๋ณ์นญ์ ViewModel๋ก ์ค์
- View์์ ์ผ์ด๋๋ ์ก์ ์ Input์ ํตํด ViewModel์ ์ ๋ฌ
- ViewModel์์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ Output์ ํตํด View๋ก ์ ๋ฌํ์ฌ UI๋ฅผ ์ ๋ฐ์ดํธ
- Input/Output ํจํด์ ํ์ฉํ์ฌ MVVM ๊ตฌ์กฐ์์ View์ ViewModel ๊ฐ์ ์๋ฐฉํฅ ํต์ ์ ๋ํ ๋ฐ์ดํฐ์ ํ๋ฆ์
์ง๊ด์ ์ผ๋ก ํ์ ๋ฐ ๊ด๋ฆฌ
API ํธ์ถ๋ก ์ธํ ๋คํธ์ํฌ ์์ฒญ ์ ์์ฒญ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ RequestDTO๋ก ์์ฒญ, ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ
ResponseDTO๋ก ๋ฐ์ผ๋ฉฐ, ResposeDTO๋ฅผ Entity๋ก ๋ณํํ์ฌ ๊ด๋ฆฌ
-
RequestDTO: API ํธ์ถ ์ ViewModel๊ณผ UseCase๋ฅผ ํตํด ๋ฐ์์จ Query ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ Repository ๊ณ์ธต์์
RequestDTO ๊ฐ์ฒด๋ก ๋ณํํ์ฌ Network Manager์ ์ ๋ฌ -
ResponseDTO: ์๋ฒ API๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ JSON ๋ฐ์ดํฐ๋ฅผ ResponseDTO ๊ฐ์ฒด ๋ฐ์ดํฐ๋ก ๋ณํ ํ ์ฑ์์ ์ฌ์ฉํ๋
๋ฐ์ดํฐ์ ํํ๋ก ๊ฐ๊ณต๋ Entity ๊ฐ์ฒด ๋ฐ์ดํฐ๋ก ๋ณํํ์ฌ UseCase๋ก ์ ๋ฌ -
Entity: ์ฑ ๋ด ๋๋ฉ์ธ ์ฆ, ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ก, ResposeDTO์์ ๋ณํ๋ ํ UseCase๋ก ์ ๋ฌ๋์ด
UI ์ ๋ฐ์ดํธ๋ฅผ ์ํด ViewModel๋ก ์ ๋ฌ
5. Unit Test (๊ด๋ จ์ฝ๋)
-
๋ชฉ์ ๋ฐ ์ค๊ณ: Input/Output์ ๋ํ ๋ฐ์ดํฐ ํ๋ฆ ๋ฐ API ํธ์ถ์ ๋ํ ์ฑ๊ณต/์คํจ ์๋๋ฆฌ์ค๋ฅผ ํ ์คํธ
-
๊ธฐ๋ ํจ๊ณผ: ๋น์ฆ๋์ค ๋ก์ง์ ์ฑ๊ณต๊ณผ ์๋ฌ์ ๋ํ ํธ๋ค๋ง์ ๋ํ ์์ ์ ์ธ ์๋ ํ์ธ์ ํตํด ์ ๋ขฐ์ฑ ํ์ธ
-
ํ ์คํธ ์งํ: Mock ๊ฐ์ฒด(UseCase, LocalStorge)๋ฅผ ํตํ ๋คํธ์ํฌ ํต์ ๋ฐ Local DB ์ ๊ทผ์ ํ์์ผ๋ฉฐ,
Protocol ํ์ ์ผ๋ก ์ ์ธ๋ ViewModel์ ์ค์ ์ฌ์ฉ๋๋ ViewModel ๊ฐ์ฒด๋ฅผ ๋์ ํ์ฌ ์ค์ง์ ์ธ
Input/Output์ ๋ํ ์์ ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ ํ ์คํธ ์๋ฃ.
Unit Test - Mock ๊ฐ์ฒด ๋ฉ์๋ ๋ด ๋ถ๊ธฐ์ฒ๋ฆฌ
๋ณธ์ธ์ ์ฑ ๋น์ฆ๋์ค ๋ก์ง์ ์์ ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ํ ์ ๋ขฐ์ฑ ํฅ์์ ์ํด Unit Test๋ฅผ ์งํํ์๋ค.
ViewController์ Input/Output ์ก์ ์ ๋ด๋นํ๋ ViewModel์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ UseCase๋ฅผ ํ ์คํธ์ฉ Mock ๊ฐ์ฒด๋ก ๊ตฌํํ์ฌ ์์กด์ฑ์ ์ฃผ์ ํ, ํ ์คํธ๋ฅผ ์งํํ๋๋ก ์ค๊ณํ์๋ค.
ํ์ง๋ง ์์ํ์๋ง์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋๋ฐ, protocol์ ์๊ตฌ๋ ๋ฉ์๋๋ฅผ ํตํด Mock ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ API ๋คํธ์ํฌ ํต์ ํ ์คํธ๋ฅผ ์งํํ๊ธฐ์ ๋งค๊ฐ๋ณ์๋ก๋ ์ฑ๊ณต๊ณผ ์คํจ ์ผ์ด์ค์ ๋ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ด ํ ์คํธ๋ฅผ ์งํํ๊ธฐ์ ์ด๋ ค์ด ์ํฉ์ ์ง๋ฉดํ๋ค.
์ด ์ํฉ์์ ํ์ํ ๊ฒ์ Flag์ ๋ํ ์ ํธ๋ฅผ ๋ณด๋ด์ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ด์๋ค. ํ์ง๋ง ๋๋ protocol์ ํตํด์ ๋ฉ์๋์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ class ๊ตฌํ์ฒด ๋ด๋ถ์ ์ ํธ๋ฅผ ๋ณด๋ผ ๋ฐฉ๋ฒ์ด ์์๊ณ ์ฌ๊ธฐ์ ๋ด๊ฐ ํ ์ ์๋ ์ต์ ์ ์ ํ์ protocol์ extension ๊ธฐ๋ฅ์ด์๋ค
protocol์์ ์๊ตฌ์ฌํญ์ ์ ์ํ ๋๋ ๋ฉ์๋ ๋ฐ ํ๋กํผํฐ์ ์ ์ธ๋ง ์ด๋ค์ง๋๋ฐ protocol extension์ ํตํด ํ์ฅํ๋ ๊ฒฝ์ฐ, ๋ฉ์๋์ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
UseCase protocol์ extension์ ํตํด API ๋คํธ์ํฌ ํต์ ๊ณผ์ ์์ ์ฑ๊ณต๊ณผ ์คํจ์ ๋ํ ๋ถ๊ธฐ๋ฅผ ๋๋ ์ ์๋ bool ํ์ ์ ํ๋กํผํฐ๋ฅผ ์ค์ ํ ์ ์๋ ๋น setter ๋ฉ์๋๋ฅผ ๊ตฌํ ํ, ํด๋น protocol์ ์ฑํํ๋ Mock ๊ฐ์ฒด์์ ์ค์ง์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ์์ ์ ํํ ์ ์์๋ค.
๋๋ถ์ ์ฑ๊ณต๊ณผ ์คํจ์ ๋ํ ์ผ์ด์ค ๋๋ค ์ฑ๊ณต์ ์ผ๋ก ํ ์คํธ๋ฅผ ์งํํ ์ ์์๋ค.
Access Token ์๋๊ฐฑ์
ํด๋น ํ๋ก์ ํธ์ ๋ชจ๋ API(๊ฒ์๋ฌผ, ํ๋ก์/ํ๋ก์ฐ ๋ฑ๋ฑ)๋
๋ก๊ทธ์ธ API๋ฅผ ํตํด ๋ฐ๊ธ๋ฐ์ Access Token์ ์๊ตฌํ๋ค.
์ด Access Token์ ์ ํจ ์๊ฐ์ ์ฝ 5๋ถ์ผ๋ก ์งง์๋๋ฐ
๊ทธ๋ก ์ธํด ์ฌ์ฉ์๋ ๊ณ์ Access Token์ด ๋ง๋ฃ๋๋ ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ๊ฒ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๊ฒ ๋์๋ค.
- Access Token์ด ๋ง๋ฃ๋ ๋๋ง๋ค ์ฌ๋ก๊ทธ์ธ์ ํ๋ ๋ฐฉ์
- Refresh Token์ ํตํด Access Token์ ์๋์ผ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ์
์ด ๋ ๋ฐฉ์์ด ๊ณ ๋ฏผ์ด ๋๋ ์ด์ ๋ Access Token์ ๊ฐฑ์ ํ๋๋ฐ ํ์ํ Refresh Token๋ ๋ง๋ฃ๋๋ ๊ฒฝ์ฐ ๋ค์
๋ก๊ทธ์ธ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ฌ๋ก๊ทธ์ธ์ ํ๋ ๊ฒ์ด ์ด๋จ๊น ๋ผ๋ ๊ณ ๋ฏผ์ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ถ๋ถ์์ ๋ ๊ณ ๋ฏผ์ ํด์ผํ๋ ๋ถ๋ถ์ด ๋ ๊ฐ์ง๊ฐ ๋ ์กด์ฌํ๋ค.
- ์ง์ ๋ก๊ทธ์ธ ๋ฐฉ์: Access Token์ด ๋ง๋ฃ๋ ๋๋ง๋ค ์ฌ์ฉ์๊ฐ ์ง์ ๋ก๊ทธ์ธํ๊ฒ ํ๋ค๋ฉด ์ฌ์ฉ์์ ๊ฒฝํ์ด ๋งค์ฐ ๋๋น ์ง ๊ฒ์ด๋ค.
- ์๋ ๋ก๊ทธ์ธ ๊ตฌํ: ์๋ ๋ก๊ทธ์ธ์ ๊ฒฝ์ฐ ์ ์ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํด์ค์ผ ํ์ง๋ง ์ด๋ฅผ UserDefaults์ธ ๋ก์ปฌ ์ ์ฅ์์ ์ ์ฅํ๋ ๊ฒ์ ๋ณด์์์ผ๋ก ๋งค์ฐ ์ํํ๋ค๊ณ ํ๋จ์ด ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์ฌ๋ก๊ทธ์ธ์ ํ๋๋ผ๋ ์ฌ์ฉ์๊ฐ ์ง์ ๋ก๊ทธ์ธ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ Access Token์ด ๋ง๋ฃ๋ ๋๋ง๋ค
์ฌ๋ก๊ทธ์ธ์ ํ๊ฒ ํ๋ ๊ฒ ๋ํ ์ฌ์ฉ์์๊ฒ ์์ฒญ๋ ๋ถํธํจ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์
Refresh Token์ ํตํ Access Token ์๋ ๊ฐฑ์ ๋ฐฉ์์ ์ ํํ๊ฒ ๋์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ๋ก๊ทธ์ธํ๋ ๋ถํธํจ์ ์ค์ด๊ธฐ ์ํด Refresh Token์ ํตํ ์๋ ๊ฐฑ์ ๋ฐฉ์์ ์ ํํ์๋ค.
์ฆ, Refresh Token์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ์์๊ฒ ์ฌ๋ก๊ทธ์ธ์ ์๊ตฌํจ์ผ๋ก์จ ๋ณด์๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ท ํ์ ๋ง์ถ๊ฒ ๋์๋ค.
์ต์ข ์ ์ผ๋ก ์์ฑ๋ ๋ก์ง์ ์๋ ์ฝ๋์ ๊ฐ๋ค.
ํ์ ViewController ๋ชจ๋ ๋ทฐ ๊ณ์ธต๊ตฌ์กฐ์์ ์ฌ๋ผ์ง๋ ์ํฉ
TabBarController
์ ์ธ๋ฒ์งธ ํญ์ ํญํ๊ฒ ๋๋ฉดEmptyViewContoller
์ฆ ๋น ViewController๊ฐ load ๋๊ณ
ํด๋น ViewController๊ฐ ๋ก๋๋๋ฉด Modal์ด Present ๋๋ ์ํฉ- Modal์ด Present ๊ฐ ๋ ์ํฉ์์ ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ Xcode Hierarchy๋ฅผ ํตํด ํ์ธํด๋ณด๋ ํ์ ViewController ๋ชจ๋
๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ์์ ์ฌ๋ผ์ง ์ํฉ - ๊ทธ๋ฆฌ๊ณ ์ ๊ฒฝ๊ณ message๊ฐ Console ์ ์ถ๋ ฅ
- ๊ฒฝ๊ณ message
- ๋จผ์
EmptyPresentViewController
๊ฐ ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ์์ ๋ถ๋ฆฌ๋์๋ค! - ์ด ๋ถ๋ฆฌ๋ ๋ทฐ์ปจํธ๋กค๋ฌ์์
UINavigationController
๋ฅผ Present ํ๋ ๊ฒ์ ์ข ์๋ ๊ฒ ๊ฐ๋ค. - ์์๋ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ณด์ฌ์ง ์ ์๋ค.
- ๊ทธ๋ฌ๋
EmptyViewController
๊ฐ ๋ณด์ฌ์ง๊ธฐ ์ ์ ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ์ ์๋์ง๋ถํฐ ํ์ธํด๋ผ - ์๊ทธ๋ฌ๋ฉด ๋จผํ๋ ์ธ์ ๊ฐ
hard exception
์ด ์ผ์ด๋ ์ฑ์ด crash ๋ ์ ์๋ค.
- ๋จผ์
์ ๊ฒฝ๊ณ message๋ฅผ ํด์ํ ํ Modal
์ด Present
๋๋ ์์น๋ฅผ ํ์ธํด๋ณด๋
viewWillAppear(_ animated: Bool)
์๋ช
์ฃผ๊ธฐ ๋ฉ์๋ ๋ด์ ์์ฑ
ํด๋น ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์๊ฐํด๋ดค์ ๋,
viewWillAppear(_ animated: Bool)
์์ ViewController
๋ฅผ Present
ํ๊ฒ๋๋ฉด ๋ทฐ๊ฐ ๋ค ๋ณด์ฌ์ง์ง ์์ ์ํ์์ Modal
์์ ๋ณด์ฌ์ง๋ViewController
๊ฐ ๊ณ์ธต๊ตฌ์กฐ์ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ด ์๋๊น ๋ผ๋ ์๊ฐ์ด ๋ค๋ฉฐ
์ด๋ฌํ ์ด์ ๋ก EmptyViewController
๊ฐ ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ์์ ์ฌ๋ผ์ง ๊ฒ์ด ์๋ ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ์ ์ฌ๋ผ๊ฐ๊ธฐ๋ ์ ์ ๋ถ๋ฆฌ๊ฐ ๋์ด ๋ฒ๋ฆฐ ๊ฒ์ด๋ผ๊ณ ํ๋จ
๊ทธ๋ ๋ค๋ฉด ViewController
๊ฐ ๋ค ๋ณด์ฌ์ง ์ํ์์ Modal
์ Present
ํ๊ฒ๋๋ฉด ํด๊ฒฐ๋ ๊ฒ์ด๋ผ๋ ํ์ ์ด ๋ค์์ผ๋ฉฐ
Modal
์ด Present
๋๋ ์ฝ๋๋ฅผ viewDidAppear(_ animated: Bool)
๋ด์ ์์ฑ
๊ทธ ํ, ๋น๋ํด์ ํ์ธํด๋ณด๋ ์๋ฌ message๊ฐ ์ฌ๋ผ์ง๊ณ ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ๋ ์ ์ฌ๋ผ๊ฐ์๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๋๋์
ViewController์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํ์ฉํ ๋, ์๊ฐ์ ์ข ํ๋ฉด์ ํด์ผ๊ฒ ๋ค ๋ผ๊ณ ์๊ฐํ๋ค.
Pull To Refresh
- ์ ์ฒด ๋ฆฌ๋ทฐ ๊ฒ์๊ธ์ ํ์ธํ๋ ํ๋ฉด์์
Pull To Refresh
๊ธฐ๋ฅ์ ๊ตฌ์ฑํด๋์ ์ํฉ - ์ด ๊ธฐ๋ฅ์ ๋ด๊ฐ ์ฌ์ฉ์์ ์
์ฅ์์ ๊ณ์ํด์ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ผ๋ก๋ ๊ฒ์๊ธ์ด
Refresh
๊ฐ ๋๊ณ ์๋ ์ง ์๋ ์ง
๊ตฌ๋ถ์ด ๋์ง ์์ ์ ๋๋ก ๋๋ฌด ๋น ๋ฅด๊ฒ ์ฌ๋ผ์ก์ผ๋ฉฐ - ์ด ๋ถ๋ถ์ด ๋ด ์ ์ฅ์์๋ ์ด์ํจ๊ณผ ๋ต๋ตํจ์ด ๋๊ปด์ก๋ค.
- ๋ฌผ๋ก ์ฝ๋๋ฅผ ๋ด๊ฐ ๊ทธ๋ ๊ฒ ์๋ํ๋๋ก ๊ตฌํ์ ํด๋จ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฆ, ๋ฐ์ดํฐ์ ๋ํ ํจ์น๋ฅผ ์์ฒญํ๊ณ ๋ฐ๋ก Refreshing์ ๋๋ด๋ฒ๋ฆฐ ๊ฒ์ด๋ค.
- ๊ทธ๋์ API ํต์ ์ด ์๋ฃ๋๋ฉด end Refreshing ๋๋๋ก ๋ก์ง์ ์์ ํด๋ด๋ ๋ฐ์ดํฐ ํจ์น ์๋๊ฐ ๋นจ๋ผ
์ ๋๋ฉ์ด์ ์ด ๋๋๋ ์์ ์ด ๊ฑฐ์ ์ ์ฌํ๋ค.
- ๊ฒฐ๊ตญ์๋
refreshing
์ ๋๋ด๋ผ๋Output Action
์ด ์ผ์ด๋๊ฒ ๋๋ฉด2์ด Delay
๋ฅผ ์ฃผ๊ณEnd Refreshing
๋๋๋ก ๋ณ๊ฒฝ - ๋ฌผ๋ก ์ด๊ฑด ๋๋ฌด ์ต์ง๋ผ๊ณ ํ ์๋ ์์ง๋ง ์ด์จ๋ ๊ฐ๋ฐ์๋ ์ฌ์ฉ์์ ์
์ฅ์์ ์๊ฐ์ ํด๋ด์ผ ํ๋ค๊ณ
์๊ฐํด๋ดค์ ๋ ์ด๊ฒ ๋ ๋์ ์ ํ์ด๋ผ๊ณ ๋๊ปด์ก๋ค.
- ์ค ๊ธฐ๊ธฐ์ ๋น๋ํด ๋ณธ ๊ฒฐ๊ณผ ์ด์ํจ๊ณผ ๋ต๋ตํจ์ ํด์๊ฐ ๋์๋ค.