'๋ฐ๋ฆฌ๋ฐ๋ฆฌ'๋ ๋ผ์ด๋๋ค์ ์ํ ์ฝ์ค ๊ด๋ฆฌ ์ดํ๋ฆฌ์ผ์ด์ (iOS)์ ๋๋ค.
ย
-
๊ธฐ๊ฐ: 2025.04.01 ~ 2025.04.07 [7์ผ] (์ ๋ฐ์ดํธ ์งํ ์ค)
-
์ธ์: Goo [1๋ช ]
ย
๋ฐ์ดํฌ ๋ผ์ด๋ฉ์ ํ๋ค๋ณด๋ฉด ์์์น ๋ชปํ๊ฒ ์์ ๊ธธ์ ๋ง์ฃผํ ๋๊ฐ ์์ต๋๋ค.
์ฌ์ง์ ์ฐ๊ฑฐ๋ ์ง๋์ ๊ธฐ๋กํ ํ๋ ์์ด ์ง๋์ณค๋ ๊ทธ ๊ธธ๋ค์,
๊ฐ๋จํ ์กฐ์๋ง์ผ๋ก ์ค์๊ฐ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ๊ณ ์ ์ฅํ ์ ์๋๋ก ๋์์ค๋๋ค.
ย
์ํคํ ์ฒ/๋์์ธ ํจํด
- MVVM + Input-Output
- Repository
- Router (API request routing)
- BaseView/BaseViewModel/BaseViewController
ํ๋ ์์ํฌ
- UIKit
- WidgetKit
- MapKit
- CoreLocation
- PhotosUI
๋ผ์ด๋ธ๋ฌ๋ฆฌ
ย
๐ ๋ผ์ดํธ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค.
๐๏ธ ์ด์ ์ ๊ธฐ๋กํ๋ ์ฝ์ค๋ฅผ ์์ ฏ์ ํ์ํฉ๋๋ค.
ํ ํ๋ฉด์์ ์ด์ ์ ๋ฌ๋ ธ๋ ์ฝ์ค ์ค ํ๋๊ฐ ๋ฌด์์๋ก ํ์๋ฉ๋๋ค.
๐ ์์ธ ๊ทผ๊ต ๋ํ ๋ฐ์ดํฌ ์ฝ์ค๋ฅผ ์๊ฐํฉ๋๋ค.
๋ถ์๊ธฐ, ๊ฒฝ๋ก, ํฌ์ธํธ๋ฅผ ํ๋์ ํ์ธํ๊ณ ์ค๋์ ๋ชฉ์ ์ง๋ฅผ ์ฝ๊ฒ ์ ํด๋ณผ ์ ์์ต๋๋ค.
๐ ์ค์๊ฐ์ผ๋ก ๋ด ์์น๋ฅผ ์ถ์ ํด ์ฝ์ค๋ฅผ ์๋์ผ๋ก ๊ธฐ๋กํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ฑ์ ์ฌ์ฉ ์ค์ด๊ฑฐ๋ ํ๋ฉด ์ ๊ธ ์์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ํฉ๋๋ค.
๐บ๏ธ ์ฌ์ง, ๋ฉ๋ชจ, ๋ ์ง, ๊ฒฝ๋ก์ ํจ๊ป ์ฝ์ค๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
๐ ์ํ๋ ์ฝ์ค ๋ถ์๊ธฐ๋ ํ ๋ง์ ๋ฐ๋ผ ํด๋๋ก ๋ถ๋ฆฌํ์ฌ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
๐ฆ ๋ณด๊ดํจ์์ ์ ์ฅํ ์ฝ์ค์ ๊ธฐ๋ก๊ณผ ์ถ๋ฐ์ง, ๊ฒฝ์ ์ง, ๋์ฐฉ์ง๊น์ง ์ธ์ ๋ ๋ค์ ํ์ธํ ์ ์์ต๋๋ค.
โ๐ป ๋ณด๊ดํจ์ ์ฝ์ค ํด๋๋ ์์ ๋ฐ ์ญ์ ํ ์ ์์ต๋๋ค.
โ๐ป ๋ณด๊ดํจ์ ์ฝ์ค๋ ์์ ๋ฐ ์ญ์ ํ ์ ์์ต๋๋ค.
ย
RxSwift
-
View์ ViewModel ๊ฐ์ ๋ณต์กํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ input, output ๊ตฌ์กฐ๋ก ๋ฐ์ธ๋ฉํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์์ต๋๋ค.
-
์ฌ๋ฌ API ์์ฒญ์ ๋์์ ๋ณด๋ด๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์ฒ๋ฆฌํด์ผํ๋ ๊ฒฝ์ฐ์
Single.zip(_:)์กฐํฉ ์ฐ์ฐ๊ณผflatMap,observe(on:)์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ โ ๋๊ธฐ ์ ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
์์น ๊ถํ ์ ์ด
-
CoreLocationManager์ ํตํด ์์น ๊ถํ ์ํ์ ๋ฐ๋ฅธ ์์ธ ์ผ์ด์ค๋ฅผ ์ธ๋ฐํ๊ฒ ๊ณ ๋ คํ์ฌ ์ฒ๋ฆฌํ์์ต๋๋ค.
-
Info.plist ์ค์ ๊ณผ CLAuthorizationStatus์ ๋ณํ์ ๋ฐ๋ฅธ ์ ์ ํ UI ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ์์ ์ ์ผ๋ก ์ ๊ณตํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.
๋ชจ๋ธ๊ฐ ๊ณ์ธต ๋ถ๋ฆฌ
-
API ๊ตฌ์กฐ / DB ์คํค๋ง / UI ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋๋ผ๋ ๊ฐ ๋ ์ด์ด์ ๋ฐ์ดํฐ ๋ชจ๋ธ ์์ ๋ฒ์๋ฅผ ์ต์ํํ ์ ์๋๋ก ์ค๊ณํ์์ต๋๋ค.
-
API โ View โ Realm๊ฐ์ ํ๋ฆ์์ DTO๋ฅผ ๋์ ํ์ฌ ์๋ก์ ๊ตฌํ์ ์ข ์๋์ง ์๋๋ก ์ค๊ณํ์์ต๋๋ค.
์ปดํฌ๋ํธ ์ค์ฌ ์ค๊ณ
-
๊ธฐ๋ฅ ๋จ์ ๋ชจ๋ํ ๋ฐ ์ญํ ๊ธฐ๋ฐ ์ฑ ์ ๋ถ๋ฆฌ(SRP) ๋ฅผ ํตํด, ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ์ ํ๋ณดํ์์ต๋๋ค.
-
์ง๋์ ์์น ๊ธฐ๋ฐ ๊ธฐ๋ฅ์ CoreLocationManager๋ฅผ ํตํ ์์น ์ฒ๋ฆฌ ๋ก์ง๊ณผ, Custom MKMapView๋ฅผ ํตํ ์๊ฐํ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ์์น ์ฒ๋ฆฌ์ UI ํฌํ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ์์ต๋๋ค.
-
๊ณตํต UI ์์๋ ์ปค์คํ ์ปดํฌ๋ํธ๋ก ์ถ์ํํ์ฌ ์ฑ ์ ์ฒด์ ์ผ๊ด๋ ๋์์ธ๊ณผ ์ฝ๋ ์คํ์ผ์ ์ ์ฉํ ์ ์๋๋ก ํ์์ต๋๋ค.
ย
์์น ๊ถํ ๋ณ๊ฒฝ ์ ์ง๋ ๋ฑ ๋ทฐ์ ๋ฐ์์ด ์๋ ๋ฌธ์
-
๋ฌธ์ ์ํฉ
-
์ฌ์ฉ์๊ฐ ์ฑ ์คํ ์ค ์์น๊ถํ์ ๋ณ๊ฒฝ(๋ฐฑ๊ทธ๋ผ์ด๋ โ ๊ฑฐ๋ถ) ํ์ ๋,
CoreLocationManager๋ ๊ถํ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง๋งMKMapView๋ฑ ๋ทฐ์๋ ๋ณ๊ฒฝ๋ ๊ถํ์ ๋ํ UI ํผ๋๋ฐฑ์ด ๋ฐ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค. -
์์น๋ฅผ ์ถ์ ํ์ฌ ๊ธฐ๋ก ์ค์ด์๋ค๊ฑฐ๋, ๋ณด๊ดํจ์์ ์ด์ ์ ๊ธฐ๋กํ๋ ๊ฒฝ๋ก๋ฅผ ํ์ธ ์ค์ด์๋ค๋ฉด ํ์ฌ ์์ ์ ์ค๋จํ๊ณ ํ๋ฉด ์ด๋ ๋๋ ์ค์ ํ๋ฉด์ผ๋ก ์ด๋์ ์ ๋ํ๋ ๊ธฐ๋ฅ์ด ํ์ํ์ต๋๋ค.
-
-
์์ธ ๋ถ์
- CoreLocationManager๋ฅผ ํตํ ์์น ์ฒ๋ฆฌ ๋ก์ง๊ณผ, Custom MKMapView๋ฅผ ํตํ ์๊ฐํ ์ปดํฌ๋ํธ๋ฅผ ์์ ํ ๋ถ๋ฆฌํ ์ํ์๊ธฐ ๋๋ฌธ์, ๊ถํ ๋ณ๊ฒฝ ์ ๋ณ๋์ notification์ด๋ ์ฝ๋ฐฑ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ํฉ์ด์์ต๋๋ค.
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
didChangeAuthorization๋ด๋ถ์์ ์์น ๊ถํ ์ํ๋ฅผ ๊ฐ์งํ์ฌ, ์์น ๊ถํ ๋ณ๊ฒฝ ์ rootViewController์ ์์น ๊ถํ ํ์ฉ์ ์ ๋ํ๋permissionAlert๋ฅผ ๋์์ฃผ์์ต๋๋ค. -
cancel Action handler ์๋ ํ์ฌ ์ถ์ ์ค์ธ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด UserDefault์ ์์ ์ ์ฅ๋๋๋ก ํ์ฌ ์ ์ ์๊ฒ ์์ ์ ์ธ UX๋ฅผ ์ ๊ณตํ์์ต๋๋ค.
-
setting Action hanler ์๋ ์ค์ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ๋ก์ง์ ๊ตฌํํ์ฌ ์์น ๊ถํ์ ํ์ฉํ๋๋ก ์ ๋ํ์์ต๋๋ค.
-
-
๊ฒฐ๊ณผ
- ์ฑ ์คํ ์ค ๊ถํ ๋ณ๊ฒฝ ์์ ์ ์ ํ UI ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ณ , ๊ธฐ๋ก ์ค์ด์๋ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ์ฌ UX์ ๊ธฐ๋ฅ ์์ ์ฑ์ด ๊ฐ์ ๋์์ต๋๋ค.
ย
์ฌ๋ฌ API ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ UI์ ์์ ์ ์ผ๋ก ๋ฐ์ํ๋ ํ๋ฆ ์ค๊ณ
-
๋ฌธ์ ์ํฉ
-
์ฌ์ฉ์๊ฐ ์ฝ์ค๋ฅผ ์ ์ฅํ ๋์, ์ถ๋ฐ์ง / ๊ฒฝ์ ์ง(5๊ฐ) / ๋์ฐฉ์ง์ ์๊ฒฝ๋์ ๋ฐ๋ฅธ ์ฃผ์๊ฐ์ ๋ฐ์์ค๋ API ์์ฒญ์ ๋์์ ๋ณด๋ด๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ Realm ์ ์ฅํ๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค.
-
ํ์ง๋ง ์ถ๋ฐ์ง / ๊ฒฝ์ ์ง(5๊ฐ) / ๋์ฐฉ์ง์ ์๊ฒฝ๋๋ฅผ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๊ณ ์์๊ณ , API ์์ฒญ์ด ๋น๋๊ธฐ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์๊ฒฝ๋ ์์๊ฐ ์ผ๊ด๋์ง ์์ ์ํ๋ก Realm์ ์ ์ฅ๋๊ฑฐ๋ ์ผ๋ถ ๊ฒฝ์ ์ง ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
-
-
์์ธ ๋ถ์
- ๊ฐ ์๊ฒฝ๋ ๊ฐ์ ๋ํ API ์์ฒญ์ด ๋น๋๊ธฐ๋ก ๊ฐ๋ณ ์ฒ๋ฆฌ๋๋ฉด์, ์๋ต์ด ๋์ฐฉํ๋ ์์๊ฐ ๋ฌ๋ผ์ก๊ณ ๊ทธ๋ก ์ธํด ์๋์ ์์น ๋ฐฐ์ด ์์์ ๋งคํ๋์ง ์์ ์ฃผ์ ๋ฐ์ดํฐ๊ฐ Realm์ ์ ์ฅ ๋๊ฑฐ๋ ๋๋ฝ๋์์ต๋๋ค.
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
๊ฐ API ์์ฒญ์ ํ๋์
Single๋ก ๊ฐ์ธ๊ณ ,Single.zip(\_:)์กฐํฉ ์ฐ์ฐ์๋ฅผ ํตํด ์ฌ๋ฌ ์์ฒญ์ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ Single๋ก ๋ฌถ์ด ์๋ต ์์๋ฅผ ๋ณด์ฅํ๊ณ , ๋ชจ๋ ์์ฒญ์ด ์๋ฃ๋ ํ์ ๋ค์ ๋ก์ง์ผ๋ก ์งํํ๋๋ก ํ์์ต๋๋ค. -
์ฌ์ฉ์์ ์ ์ฅ ๋ฒํผ ์ ๋ ฅ ์คํธ๋ฆผ์๋ flatMapLatest๋ฅผ ์ ์ฉํ์ฌ ๊ฐ์ฅ ์ต์ ์ ์ ์ฅ ์์ฒญ๋ง ์ ํจํ๊ฒ ์ฒ๋ฆฌ๋๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
-
๊ฒฐ๊ณผ๊ฐ UI์ ์์ ํ๊ฒ ๋ฐ์๋๋๋ก
.observe(on: MainScheduler.instance)๋ฅผ ์ถ๊ฐํ์ฌ, UI ์ ๋ฐ์ดํธ๋ฅผ Main Thread์์ ์ฒ๋ฆฌํ๋๋ก ๋ช ์ํ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ฅ ๋ฒํผ ํญ โ Observable ์คํธ๋ฆผ (์ฝ์ค ์ ๋ณด) โ flatMapLatest โ ์ ํจ์ฑ ๊ฒ์ฌ (์ฝ์ค์ ๋๋ฝ๋ ์ ๋ณด ์๋ ์ง) โ Observable ์คํธ๋ฆผ (์ ์ฅ ๊ฐ๋ฅํ ์ฝ์ค ์ ๋ณด) โ flatMap โ API ์์ฒญ (requestMultiple / Single.zip) โ ๊ฒฐ๊ณผ(Result<Success, Error>) Observable๋ก ๋ฐํ โ MainScheduler (UI ์ค๋ ๋) โ bind โ ์ฑ๊ณต ์ Realm ์ ์ฅ ๋ฐ UI ํผ๋๋ฐฑ or ์คํจ ์ UI ํผ๋๋ฐฑ -
-
๊ฒฐ๊ณผ
-
๋ชจ๋ ์๊ฒฝ๋ ๊ฐ์ ๋ํ ์ฃผ์ ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ ์์๋๋ก ๋ณด์ฅ๋ฐ์ ์ ์๊ฒ ๋๋ฉด์, ์ถ๋ฐ์ง๋ถํฐ ๋์ฐฉ์ง๊น์ง์ ์ฃผ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ์ ์ง๋์์ต๋๋ค.
-
์ ์ฒด์ ์ผ๋ก API ์์ฒญ ํ๋ฆ๊ณผ UI ๋ฐ์ ํ๋ฆ์ด ๋ช ํํด์ก๊ณ , ๋น๋๊ธฐ ์์ ์ค๋ฅ๋ฅผ ํจ์จ์ ์ธ Rx ํจํด ์กฐํฉ์ผ๋ก ์์ ํํ ์ ์์์ต๋๋ค.
-
ย
๐๐ป Thanks to Unsplash API
- ์ด ์ฑ์ Unsplash Image API ๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฌ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.





