๋ด๊ฐ ๊ฐ๋ ๊ณต๊ฐ์ ์์
์ ์ถ์ต์ ๋ด์ ๋ค๋ฅธ ์ฌ๋๊ณผ ๊ณต์ ํ๋ ์์
๋ฏธ๋์ด ์ฑ
1. ์์
, ์ฌ์ง, ๊ธ์ ์ถ์ต์ ๋ด์ ๋ค๋ฅธ ์ฌ๋๊ณผ ๊ณต์ ํ ์ ์์ต๋๋ค
2. ๋์ ์ถ์ต์ ํ๋ ์ด๋ฆฌ์คํธ ํ์์ผ๋ก ๊ฐ์ํ ์ ์์ต๋๋ค
3. ์ง๋๋ฅผ ๋ณด๋ฉฐ ๋์ ์ถ์ต์ด๋ ํ๋ก์ ํ ์ฌ๋์ ์ถ์ต์ ๊ฐ์ํ ์ ์์ต๋๋ค
4. ํผ๋ ํ์์ผ๋ก ๋ค๋ฅธ ์ฌ๋์ ์ถ์ต์ ์ดํด๋ณผ ์ ์์ต๋๋ค
5. ๋ค๋ฅธ ์ฌ๋์ ์ถ์ต์ ๋๊ธ์ ๋ฌ ์ ์์ต๋๋ค
Purpose
Library
ํ๋ฉด ๊ตฌํ
UIKit
๋ฐ์ดํฐ๋ฒ ์ด์ค
Firebase
์์กด์ฑ ๊ด๋ฆฌ ๋๊ตฌ
CocoaPads
๋์์ธ ํจํด
Clean Architecture With MVVM-C
๋น๋๊ธฐ ์ฒ๋ฆฌ
RxSwift
ํต์ ๋คํธ์ํฌ
Alamofire
์์กด์ฑ์ฃผ์
Swinject
์ด๋ฏธ์ง ์บ์ฑ
Kingfisher
๊ธฐํ
SnapKit, MapKit, CoreLocation, SpotifySDK, FloatingPanel
๐ง Spotify ๊ณ์ ์ ๋ณด ๊ธฐ๋ฐ์ผ๋ก ๋ก๊ทธ์ธํฉ๋๋ค.
๋ก๊ทธ์ธ
ํ์๊ฐ์
๐ง ๋ด ๊ฒ์๋ฌผ์ ์์
์ ํ๋ ์ด๋ฆฌ์คํธ๋ก ๋ค์ ์ ์์ต๋๋ค.
ํ๋ ์ด๋ฆฌ์คํธ
๐บ๏ธ ๋์ ํ๋ก์ํ ์ ์ ์ ๊ฒ์๋ฌผ์ ์ง๋์์ ๋ณผ ์ ์์ต๋๋ค.
์ง๋
์ฅ์ ๊ฒ์
ํ์ฌ ์์น ๊ฒ์
โ๏ธ ๊ฒ์๋ฌผ์ ์ถ๊ฐํ์ฌ ์ถ์ต์ ์ ์ฅํ ์ ์์ต๋๋ค.
๊ฒ์๋ฌผ ์ถ๊ฐ
์์
๊ฒ์
๋ ์ง ์ ํ
๐ ๋ค๋ฅธ ์ ์ ์ ๊ฒ์๋ฌผ๋ค์ ๋๋ฌ๋ณผ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์
์ ์ ๊ฒ์
๐จโโ๏ธ ๋์ ์ ๋ณด, ๋ด ๊ฒ์๋ฌผ, ํ๊ทธ ๋ ๊ฒ์๋ฌผ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ์ ํ๋กํ์ผ
ํ๋ก์ฐ ๋ฆฌ์คํธ
๐ ๊ฒ์๋ฌผ์ ์์ธํ๊ฒ ๋ณผ ์ ์์ต๋๋ค.
์์ธ ๋ด์ฉ
๐ฌ ๋๊ธ๋ก ๋ค๋ฅธ ์ ์ ์ ์ํต ํ ์ ์์ต๋๋ค.
๋๊ธ
โก๏ธ Clean Architecture
MVVM ๊ตฌ์กฐ์์ ViewModel์ด ๋ชจ๋ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด Clean Architecture๋ฅผ ์ ์ฉํ์์ต๋๋ค.
๊ฐ๊ฐ์ ๋ ์ด์ด๋ฅผ ์ญํ ์ ๋ฐ๋ผ ๋ถ๋ฆฌํ์ฌ ๋ฐฉ๋ํ ์์ ์ฝ๋๋ฅผ ์ฝ๊ฒ ํ์
ํ ์ ์๋๋ก ํ๊ณ ์ถ์์ต๋๋ค.
ํ๋กํ ์ฝ๋ก ๊ฐ ๋ ์ด์ด์ ๊ฐ์ฒด์ ๋ํ ์ถ์ํ๋ฅผ ์งํํ์ฌ ์์ ์ ๋ซํ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ์์ต๋๋ค.
ํ๋กํ ์ฝ๋ก ํด๋น ํด๋์ค์ ์ญํ ๊ณผ ํํ๋ฅผ ๋ช
์ํด์, ๊ฐ์ฒด๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ฝ๊ฒ ํ์
ํ ์ ์์์ต๋๋ค.
์ฌ์ฉ์ ์
๋ ฅ ๋ฐ ๋ทฐ์ ๋ก์ง๊ณผ ๋น์ฆ๋์ค์ ๊ด๋ จ๋ ๋ก์ง์ ๋ถ๋ฆฌํ๊ณ ์ถ์์ต๋๋ค.
View์ Event๋ก ๋ถํฐ UI์์
๊น์ง ๋จ๋ฐฉํฅ์ผ๋ก ๊ด๋ฆฌํ ์ ์์์ต๋๋ค.
Input, Output์ผ๋ก ๋๋์ด ViewModel์ ์ ๋ฌ๋ฐ์ ๊ฐ๊ณผ, ์ ๋ฌํ ๊ฐ์ ์ง๊ด์ ์ผ๋ก ์ธ์ํ ์ ์์์ต๋๋ค.
ViewController๊ฐ ViewModel์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ์์กด์ฑ์ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
์ฝ๋ ๋ฒ ์ด์ค๋ก UI๋ฅผ ์์ฑํ๊ฒ๋๋ฉด StoryBoard๋ก UI๋ฅผ ์์ฑํ ๋ ๋ณด๋ค View๋ค์ ๊ณ์ธต๊ณผ Flow๋ฅผ ํ์
ํ๊ธฐ๊ฐ ํ๋ค๋ค๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
ViewController์ ํ๋ฉด ์ ํ ์ญํ ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ์ ์ฉํ์ต๋๋ค.
View์ ๊ณ์ธต๊ณผ Flow์ ๋ํ ์ ๋ณด๋ฅผ ํ ๋์ ํ์
ํ ์ ์์์ต๋๋ค.
์์กด์ฑ ์ฃผ์
์ด ๋ณต์กํด์ง ๊ฒฝ์ฐ DI Container๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๊ตฌํํ์ฌ ์์กด์ฑ์ ๊ดํ ๋ด์ฉ์ ๋ถ๋ฆฌํ์์ต๋๋ค.
์ฌ์ฉ์ ์ธ์ฆ, ์ ๋ณด ์ ์ฅ ๋ฑ์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด ๋ณ๋์ ์๋ฒ ๊ตฌํ์์ด ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ ๊ฐ๋ฅํ FireBase๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
Firebase Authentication์ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ ๊ธฐ๋ฐ์ผ๋ก Spotify์ UID์ ๋ณด๊ฐ ์ผ์นํ๋ ์ ์ ์ ๋ณด๋ฅผ ์ฐพ์ ์๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค.
Firebase Firestore๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด, ๊ฒ์๋ฌผ ์ ๋ณด, ๋๊ธ ์ ๋ณด๋ฅผ ์ ์ฅํ์์ต๋๋ค.
โก๏ธ Swinject(DIContainer)
ํ๋ฉด ์ ํ์ ๋ด๋นํ๋ Coordinator์์ ์์กด์ฑ ์ฃผ์
์ ์ญํ ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ๋์
ํ์ต๋๋ค.
์์กด์ฑ ์ฃผ์
์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค.
๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์๋น์ค์ฌ์ ๋๋ถ๋ถ์ ๋์์ด ๋น๋๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ Thread ๊ด๋ฆฌ์ ์ฃผ์ํด์ผํฉ๋๋ค.
ํ์ด์ด๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค์ฒฉ๋ ๋คํธ์ํฌ ์ฐ์ฐ์ ์ฒ๋ฆฌํด์ผํ๋ฏ๋ก ํ๋์ ์ฐ์ฐ์ ์ฝ๋ฐฑ์ด ์ค์ฒฉ๋์ด ๊ฐ๋
์ฑ ์ ํด ๋ฐ ํด๋จผ ์๋ฌ๋ก ์ธํ ๋๋ฒ๊ทธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
escaping closure๊ฐ ์๋ RxSwift์ Operator๋ฅผ ํ์ฉํ์ฌ ์ฝ๋ ์์ด ๊ฐ์ํ์ฌ ๊น๋ํด์ง๊ณ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์์์ต๋๋ค.
๋น๋๊ธฐ ์ฝ๋(DispatchQueue, OperationQueue)๋ฅผ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ์ง ์์ ์ผ๊ด์ฑ ์๋ ๋น๋๊ธฐ ์ฝ๋๋ก ์์ฑํ ์ ์์์ต๋๋ค.
SpotifySDK์์ ์ง์ ํ์ง ์๋ ๊ธฐ๋ฅ(์์
๊ฒ์, spotify ์ ์ ํ๋กํ์ผ ๋ฑ)์ด ์์ด SpotifyAPI๋ฅผ ์ด์ฉํด Fetchํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฌ ํ์๊ฐ ์์์ต๋๋ค.
URLSession์ ๋นํด ๊ตฌํ์ ๊ฐํธํจ๊ณผ ๋ณด๋ค ์ข์ ๊ฐ๋
์ฑ์ด ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์์ต๋๋ค.
๋ง์ View์์ ๋คํธ์ํฌ ์์ฒญ์ ํตํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
์๋ณธ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋๋ก ๋ถ๋ฌ์ค๊ฒ ๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค.
CollectionView ๋๋ TableView์์ ์คํฌ๋กค์ ํ ๋๋ง๋ค ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๋ ์์
์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ ๋คํธ์ํฌ ์์ฒญ์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๊ฒช์์ต๋๋ค.
์บ์ฑ์ ๋์
ํด์ ๋คํธ์ํฌ ํต์ ๋น์ฉ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์์ต๋๋ค.
Downsampling ๊ณผ์ ์์ ์ด๋ฏธ์ง ๋ฒํผ์ ๋ค์ด ์๋ ๋ถํ์ํ ํฝ์
์ ์ญ์ ํ์ฌ, Decode ๋ฐ Rendering ๊ณผ์ ์์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์์ต๋๋ค.
์ฑ์์ Spotify์ ์์
์คํธ๋ฆฌ๋ฐ ์๋น์ค๋ฅผ ์ง์ ์ด์ฉํ ์ ์๊ฒํ๊ณ ์ฌ์ฉ์๋ ์ฑ์ ๋ ๋์ง ์๊ณ ๋ Spotify์ ์์
์ ๋ค์ ์ ์๊ฒ๊ตฌํํ๊ณ ์ถ์์ต๋๋ค.
Webkit์ ์ด์ฉํ์ง ์๊ณ Spotify ์ฑ์ ์ด์ฉํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ์ ์ํ ํ ํฐ์ ํ๋ํ๊ณ ์ถ์์ต๋๋ค.
์ฌ์ฉ์๋ ์ฑ์ ๋ ๋์ง ์๊ณ ๋ Spotify์ ์์
์ ๋ฃ๊ฒ ๋์ด ์ด๋ก์จ ์ฌ์ฉ์ ๊ฒฝํ์ด ํฅ์๋์์ต๋๋ค.
Spotify์ ์์
์คํธ๋ฆฌ๋ฐ ์๋น์ค๋ฅผ ์ฑ์ ํตํฉํจ์ผ๋ก์จ, ์ฑ์ ๊ธฐ๋ฅ์ด ํ์ฅ๋๋ฉฐ, ๋์ฑ ํ๋ถํ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋์์ต๋๋ค.
https://drive.google.com/file/d/1Mb8IjErDrRb41u6DSfQXOIS0eYJtkfC0/view?usp=sharing
๋
ธ์
MeloPlace: RxSwift ์ ์ฉ๊ณผ ๋๊ผ๋ ์ฅ์