๋ด๊ฐ ๊ฐ๋ ๊ณต๊ฐ์ ์์ ์ ์ถ์ต์ ๋ด์ ๋ค๋ฅธ ์ฌ๋๊ณผ ๊ณต์ ํ๋ ์์ ๋ฏธ๋์ด ์ฑ
Purpose | Library |
---|---|
ํ๋ฉด ๊ตฌํ | UIKit |
๋ฐ์ดํฐ๋ฒ ์ด์ค | Firebase |
์์กด์ฑ ๊ด๋ฆฌ ๋๊ตฌ | CocoaPads |
๋์์ธ ํจํด | Clean Architecture With MVVM-C |
๋น๋๊ธฐ ์ฒ๋ฆฌ | RxSwift |
ํต์ ๋คํธ์ํฌ | Alamofire |
์์กด์ฑ์ฃผ์ | Swinject |
์ด๋ฏธ์ง ์บ์ฑ | Kingfisher |
๊ธฐํ | SnapKit, MapKit, CoreLocation, SpotifySDK, FloatingPanel |
๋ก๊ทธ์ธ | ํ์๊ฐ์ |
---|---|
ํ๋ ์ด๋ฆฌ์คํธ |
---|
์ง๋ | ์ฅ์ ๊ฒ์ | ํ์ฌ ์์น ๊ฒ์ |
---|---|---|
๊ฒ์๋ฌผ ์ถ๊ฐ | ์์ ๊ฒ์ | ๋ ์ง ์ ํ |
---|---|---|
๋ธ๋ผ์ฐ์ | ์ ์ ๊ฒ์ |
---|---|
์ ์ ํ๋กํ์ผ | ํ๋ก์ฐ ๋ฆฌ์คํธ |
---|---|
์์ธ ๋ด์ฉ |
---|
๋๊ธ | |
---|---|
- 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๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด, ๊ฒ์๋ฌผ ์ ๋ณด, ๋๊ธ ์ ๋ณด๋ฅผ ์ ์ฅํ์์ต๋๋ค.
- ํ๋ฉด ์ ํ์ ๋ด๋นํ๋ 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