์ด ์ ์ฅ์๋ 2026๋ 8์ 10์ผ๋ถ๋ก ๊ฐ๋ฐ์ ์ข ๋ฃํ์ต๋๋ค.
Android MVP๋ฅผ ์์ฑํ์ง ๋ชปํ ์ํ์์ ์ค๋จ๋์์ผ๋ฉฐ ์ถ๊ฐ ๊ฐ๋ฐ์ด๋ ์ ์ง๋ณด์ ๊ณํ์ ์์ต๋๋ค. ์ด ์ ์ฅ์๋ Feelin Android๊ฐ ๋ชฉํ๋ก ํ๋ ๊ธฐ์ ์ ๋ฐฉํฅ, ์ค์ ๊ตฌํ ๋ฒ์์ ํ๊ณ๋ฅผ ๊ธฐ๋กํ๊ณ ์ ๋ณด์กดํฉ๋๋ค.
Feelin์ ์ธ๋ ์์ ์ ์ค์ฌ์ผ๋ก, ์ธ์ ๊น์ ๊ฐ์ฌ์ ์์ ์ ๋ํ ๊ฐ์์ ๊ธฐ๋กํ๊ณ ๊ฐ์ ์ํฐ์คํธ๋ฅผ ์ข์ํ๋ ์ฌ์ฉ์๋ค๊ณผ ์ํตํ๋๋ก ๊ธฐํ๋ ์์ ์ปค๋ฎค๋ํฐ์ ๋๋ค.
์ด ์ ์ฅ์๋ ๊ธฐ์กด Feelin ์๋น์ค๋ฅผ Android๋ก ํ์ฅํ๋ ค๊ณ ๊ฐ๋ฐํ ํด๋ผ์ด์ธํธ์ ๋๋ค. ๊ธฐ์กด iOS ์ฑ์ ๊ธฐ๋ฅ๋ง ๋น ๋ฅด๊ฒ ์ฌํํ๋ ํฌํธํด๋ฆฌ์ค ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๋์ ์ถ์ ์ดํ์๋ ์ด์ํ Android ์ฑ์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ณ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์ ์๋ ๊ฒ์ ์ด๊ธฐ ๋ชฉํ๋ก ์ผ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ธ์ฆ๊ณผ ์ฑ ์ด์ ๊ธฐ๋ฐ์ ์ฝ๋ ์ฐ๋๊น์ง ๊ตฌํํ ๋ฐ๋ฉด, ๋ค์์ ํต์ฌ ์ฌ์ฉ์ ๊ธฐ๋ฅ์ UIยท์ํยท๋ด๋น๊ฒ์ด์ ๊ตฌํ ๋จ๊ณ์ ๋จธ๋ฌผ๋ ์ต๋๋ค. ์ต์ข ์ ์ผ๋ก ์ธ๋ ฅ ์ดํ, ํ ๋ด๋ถ์ ์ถ๊ฐ ๋๊ธฐ ๋ถ์กฑ, Android ์ฑ ๊ฐ๋ฐ์ ์ฅ๊ธฐ์ ์ธ ์ ์ฒด๊ฐ ๊ฒน์น๋ฉด์ MVP๋ฅผ ์์ฑํ์ง ๋ชปํ ์ฑ ํ๋ก์ ํธ๋ฅผ ์ข ๋ฃํ์ต๋๋ค.
Android ํ์ ๋ค์ ๋ชฉํ๋ฅผ ์ค์ฌ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์ค๊ณํ์ต๋๋ค.
- Jetpack Compose๋ก ์ ๊ท Android UI๋ฅผ ๊ตฌ์ถํ๊ณ ๋ผ์ดํธยท๋คํฌ ๋ชจ๋๋ฅผ ์ง์ํ๋ค.
- ํ๋ฉด, ์ํ ๊ด๋ฆฌ, ๋ฐ์ดํฐ ์ ๊ทผ ์ฑ ์์ ๋ถ๋ฆฌํด ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ํ์ฅํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค.
- ์์ ๋ก๊ทธ์ธ๋ถํฐ ์๋ฒ ์ธ์ฆ, ํ ํฐ ์ ์ฅยท๊ฐฑ์ , ์ธ์ ๋ณต๊ตฌ๊น์ง ํ๋์ ์ธ์ฆ ํ๋ฆ์ผ๋ก ์ฐ๊ฒฐํ๋ค.
- ๋ธ๋๋ ๋์์ธ์ Material ๊ธฐ๋ณธ ํ ํฐ์ ์ข ์์ํค์ง ์๊ณ Figma์ ์ ์๋ ๋์์ธ ์์คํ ์ ๊ทธ๋๋ก ๋ฐ์ํ์ฌ ๊ด๋ฆฌํ๋ค.
- ๊ฐ๋ฐ, ๊ฒ์ฆ, ์ด์ ํ๊ฒฝ์ ๋ถ๋ฆฌํ๊ณ CI๋ฅผ PR ๋ณํฉ ์ ํ์ง ๊ฒ์ดํธ๋ก ์ฌ์ฉํ๋ค.
- ViewModel์ ์ํ์ ์ฃผ์ Compose UI๋ฅผ ์๋ํ๋ ํ ์คํธ๋ก ๊ฒ์ฆํ๋ค.
๊ธฐ๋ฅ์ ์กด์ฌ ์ฌ๋ถ๋ง ๋์ดํ๋ฉด ํ๋ฉด ๊ตฌํ๊ณผ ์ค์ ๊ธฐ๋ฅ ์ฐ๋์ ํผ๋ํ๊ธฐ ์ฌ์ ์ข ๋ฃ ์์ ์ ์ํ๋ฅผ ์ธ ๋จ๊ณ๋ก ๊ตฌ๋ถํ์ต๋๋ค.
Android ์ฝ๋์๋ ์๋ ์ฐ๋ ํ๋ฆ์ ๊ตฌํํ์ต๋๋ค. ๊ฐ ํ๋ฆ์ด ํฌํจ๋ ์ฑ์ ๋น๋ํ ์ ์๋ ์ํ๊น์ง ํ์ธํ์ต๋๋ค. ์์นด์ด๋น ์์ ์๋ Kakao ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ ์ธ๋ถ SDK ๊ธฐ๋ฅ์ ๋์ํ ์ ์์ง๋ง Feelin ์์ฒด ์๋ฒ์ ์ฐ๊ฒฐ๋๋ ๊ธฐ๋ฅ์ ๋์ํ์ง ์์ต๋๋ค.
- Kakao SDK ๋ก๊ทธ์ธ
- Feelin ์๋ฒ๋ฅผ ํตํ ๋ก๊ทธ์ธยทํ์๊ฐ์ ๊ณผ ์จ๋ณด๋ฉ ํ๋ฆ
- ์ธ์ฆ ์ ๋ณด ์ ๋ฆฌ๋ฅผ ํฌํจํ ๋ก๊ทธ์์ ์ ์ฒด ํ๋ฆ
- Access TokenยทRefresh Token ์ ์ฅ๊ณผ ๊ฐฑ์
- ์ฑ ์์ ์ ์ธ์ ํ์ธ๊ณผ ์๋ ๋ก๊ทธ์ธ
- DataStore ๊ธฐ๋ฐ ์ธ์ฆยท์ฌ์ฉ์ ์ํ ์ ์ฅ
- ์ฝ๊ด ๋ฐ ๊ฐ์ธ์ ๋ณด์ฒ๋ฆฌ๋ฐฉ์นจ ๋ด๋ถ WebView
dev,staging,prod๋น๋ ํ๊ฒฝ ๋ถ๋ฆฌ
์ธ์ฆ ์์ญ์ Repository๊ฐ ๋ก์ปฌ ์ ์ฅ์, ์๊ฒฉ API, ์ธ๋ถ SDK๋ฅผ ์กฐํฉํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค. ์์ฒด ์๋ฒ๊ฐ ์ด์๋๋ ๊ฐ๋ฐ ๋น์์๋ Kakao ๋ก๊ทธ์ธ๋ถํฐ ์๋ฒ ์ธ์ฆ๊ณผ ์ธ์
๊ด๋ฆฌ๋ก ์ด์ด์ง๋ ํ๋ฆ์ ๊ตฌํํ์ต๋๋ค.
๋ค์ ์์ญ์ ํ๋ฉด๊ณผ ์ฌ์ฉ์ ํ๋ฆ, ์ผ๋ถ ViewModel ์ํ ๋ฐ ํ ์คํธ๋ฅผ ๊ตฌํํ์ง๋ง ๊ด๋ จ ์๋ฒ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ์ง ๋ชปํ์ต๋๋ค.
- ํ ํผ๋์ ๊ด์ฌ ์ํฐ์คํธ ํ์
- ์ํฐ์คํธ๋ณ ์ปค๋ฎค๋ํฐ
- ๊ณก ๊ฒ์๊ณผ ๊ณก๋ณ ๋ ธํธ ์กฐํ
- ๋ ธํธ ์์ฑยท์์ ยท์์ธ ํ๋ฉด๊ณผ ๋๊ธ UI
- ์ข์์ยท๋ถ๋งํฌ ๊ด๋ จ UI
- ์๋ฆผ ๋ชฉ๋ก๊ณผ ์ํ๋ณ UI
- ๊ฒ์๊ธ ์ ๊ณ ์ ์ฌ์ฉ์ ์ฐจ๋จ ํ๋ฆ
- ๋ง์ดํ์ด์ง, ์ค์ , ํ๋กํ ๋ฐ ์ฌ์ฉ์ ์ ๋ณด ์์
- ์ธ์ฆ ์ด์ธ ๋๋ฉ์ธ์ ๋๋ถ๋ถ ์๋ฒ API ์ฐ๋
- ํ์ ํํด APIยทRepository์ ํ๋ฉดยท์ํ ๊ฐ ์ฐ๊ฒฐ
- Google ์์ ๋ก๊ทธ์ธ
- ํธ์ ์๋ฆผ๊ณผ ์๋ฆผ ํญ๋ชฉ์ ํด๋นํ๋ ์ฝํ ์ธ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ
- ์ค์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํยท์ปค๋ฎค๋ํฐยท์๋ฆผยท์ ๊ณ ยท์ฐจ๋จ ๊ธฐ๋ฅ
- ์ฌ์ฉ์ ์ ๋ณด ์กฐํยท์์ ์ ์ผ๋ถ ์ ์ฅ ๋์
- ์ต์ด ๊ด์ฌ ์ํฐ์คํธ ์ ํ ํ๋ฉด๊ณผ ์ํ์ ์จ๋ณด๋ฉ ๊ฒฝ๋ก ์ฐ๊ฒฐ
- ํผ๋ ํ์ด์ง๋ค์ด์ ๊ณผ ์ฅ๊ธฐ ๋ชฉ๋ก ์ฑ๋ฅ ๊ฒ์ฆ
- ์ผ๋ถ ๋ค์ดํฐ๋ธ UI, WebView ๋ฐ ๊ณตํต ์ปดํฌ๋ํธ์ ์์ ํ ๋คํฌ ๋ชจ๋ ๋์
- ์์คํ ๋ด๋น๊ฒ์ด์ ๋ฐฉ์๊ณผ IME ์กฐํฉ์ ๋ํ ์ ์ฒด ๋ ์ด์์ ๋์
| ์์ญ | ๊ธฐ์ |
|---|---|
| ์ธ์ด | Kotlin 2.2 |
| UI | Jetpack Compose, Material 3 |
| ์ํ ๊ด๋ฆฌ | ViewModel, StateFlow, Coroutines |
| ๋ด๋น๊ฒ์ด์ | Navigation Compose 2 |
| ์์กด์ฑ ์ฃผ์ | Hilt |
| ๋คํธ์ํฌ | Retrofit, OkHttp, Kotlinx Serialization |
| ๋ก์ปฌ ์ ์ฅ์ | Preferences DataStore |
| ์ด๋ฏธ์ง | Coil |
| ์์ ๋ก๊ทธ์ธ | Kakao SDK |
| ์ ์ ๋ถ์ | Detekt, Compose rules |
| ํ ์คํธ | JUnit 4, Coroutines Test, Compose UI Test |
| CI | GitHub Actions |
| ๋น๋ ํ๊ฒฝ | Gradle Kotlin DSL, Version Catalog, Product Flavor |
ํ๋ก์ ํธ๋ ์๊ฒฉํ Clean Architecture๋ณด๋ค Google ๊ถ์ฅ ์ฑ ์ํคํ
์ฒ๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ์ผ์์ต๋๋ค. ํ์ฌ ๋ฐํ์ ์ง์
ํ๋ฆ์ FeelinApplication์์ MainActivity, FeelinNavHost๋ก ์ด์ด์ง๋๋ค.
flowchart TD
App["FeelinApplication"] --> Activity["MainActivity"]
Activity --> Nav["FeelinNavHost"]
Nav --> Screen["Compose Screen"]
Screen --> VM["ViewModel / StateFlow"]
VM --> Repo["Repository"]
Repo --> Local["Local DataSource / DataStore"]
Repo --> Remote["Remote DataSource / Retrofit"]
Repo --> SDK["SDK DataSource / Kakao"]
์ด ํ๋ฆ์ ์ธ์ฆ ์์ญ์ ๊ธฐ์ค์ผ๋ก ํ๋ฉฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ UI์ ์ํ๋ง์ผ๋ก ๊ตฌ์ฑ๋์ต๋๋ค.
์ฃผ์ ์์ค ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
app/src/main/java/com/lyrics/feelin/
โโโ core/
โ โโโ data/ # datasource, repository, interceptor, DI
โ โโโ designsystem/ # ๊ณตํต Compose ์ปดํฌ๋ํธ์ ์์ด์ฝ
โ โโโ domain/ # ๊ณต์ ๋ชจ๋ธ๊ณผ enum
โโโ navigation/ # ๋ชฉ์ ์ง์ ์ฑ ๋ด๋น๊ฒ์ด์
๊ทธ๋ํ
โโโ presentation/
โ โโโ designsystem/theme/ # ๋ธ๋๋ ์์๊ณผ CompositionLocal
โ โโโ view/ # ๊ธฐ๋ฅ๋ณ ํ๋ฉด, ์ํ, ViewModel
โโโ FeelinApplication.kt
โโโ MainActivity.kt
๋ ์ด์ด ๊ตฌ์กฐ๋ ์ธ์ฆ ๊ธฐ๋ฅ์์ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํ๋์ต๋๋ค. ํ, ์ปค๋ฎค๋ํฐ, ์๋ฆผ ๋ฑ์ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ํ์ฅํ ํ๋ฉด๊ณผ ์ํ ๊ณจ๊ฒฉ์ ๊ฐ์ท์ง๋ง ์ข ๋ฃ ์์ ๊น์ง ๋์ผํ ์์ค์ ๋ฐ์ดํฐ ๋ ์ด์ด์ ์๋ฒ ์ฐ๋์ ์์ฑํ์ง ๋ชปํ์ต๋๋ค.
์ฒ์๋ถํฐ ์๊ฒฉํ ๋ฉํฐ ๋ชจ๋ ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์๋ ๊ฒํ ํ์ง๋ง ํ์ ๊ฒฝํ๊ณผ ๊ฐ๋ฐ ์๋๋ฅผ ๊ณ ๋ คํด ๋จ์ผ :app ๋ชจ๋๋ก ์์ํ์ต๋๋ค. ๊ฒฝํ์ด ์ถฉ๋ถํ์ง ์์ ์ํ์์ ๋ชจ๋์ ๊ฒฝ๊ณ๋ฅผ ๋จผ์ ๊ณ ์ ํ๋ฉด ๊ธฐ๋ฅ ๊ตฌํ ์๋๊ฐ ํฌ๊ฒ ๋๋ ค์ง ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค.
์ด ์ ํ์ผ๋ก ์ด๊ธฐ ์ง์ ๋น์ฉ์ ๋ฎ์ท์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ธฐ ์ ์ ํ๋ก์ ํธ๊ฐ ์ค๋จ๋์ด ๊ธฐ๋ฅ๊ณผ ๊ณตํต ์ฑ ์์ ๋ชจ๋ ๋จ์๋ก ๋ถ๋ฆฌํ๋ ๋จ๊ณ์๋ ๋๋ฌํ์ง ๋ชปํ์ต๋๋ค.
๊ธฐ์กด XML ์ฑ์ ์ ํํ๋ ํ๋ก์ ํธ๊ฐ ์๋๋ผ ์ด์์ ๋ชฉํ๋ก ํ ์ ๊ท ์ฑ์ด์๊ธฐ ๋๋ฌธ์, ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝํ ์์ฒด๋ฅผ ๋ชฉํ๋ก ์ผ์ง ์๊ณ ์ฒ์๋ถํฐ Compose๋ก ์์ฑํ์ต๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ณตํต ์ปดํฌ๋ํธ, ์ํ ๊ธฐ๋ฐ UI, ๋ผ์ดํธยท๋คํฌ ํ๋ฆฌ๋ทฐ์ Compose UI ํ ์คํธ๋ฅผ ํจ๊ป ๊ตฌ์ถํ์ต๋๋ค.
์๊ฒฉํ Clean Architecture์ MVI๋ ๊ฒํ ํ์ง๋ง ์ฑ ์ ์๊ณผ ์ด์ ์ผ์ ์ ๋ ํ์ค์ ์ธ Google ๊ถ์ฅ ์ฑ ์ํคํ ์ฒ์ MVVM์ ์ ํํ์ต๋๋ค. ์ด๊ธฐ๋ถํฐ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ Intent๋ก ๋ชจ๋ธ๋งํ๋ ๋น์ฉ์ ์ค์ด๊ณ ViewModel๊ณผ StateFlow๋ฅผ ์ค์ฌ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ธ์ฆ ์์ญ์ฒ๋ผ ์๋ฒ์ ์ฐ๋๋ ๊ธฐ๋ฅ์ ์ฑ ์์ด ๋น๊ต์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์ง๋ง ์ผ๋ถ ์ ์ญ UI์ ๋ด๋น๊ฒ์ด์ ์ ๊ดํ ์ฑ ์์ ํ ํ์ผ์ ์ง์ค๋์ต๋๋ค.
Koin๊ณผ ๋น๊ตํ ๋ค ์ปดํ์ผ ํ์ ๊ฒ์ฆ์ ์ ๊ณตํ๋ Hilt๋ฅผ ์ ํํ์ต๋๋ค. ์ฑ ๋ฐํ์์ ์์กด์ฑ ๊ตฌ์ฑ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๋ ์ํฉ์ ์ค์ด๊ณ ์ ํ์ผ๋ฉฐ DataStore, Repository, Retrofit๊ณผ ์ธ์ฆ ๊ด๋ จ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ ๋ ์ค์ ๋ก ์ฌ์ฉํ์ต๋๋ค.
Ktor ๋์ ํ์ด ์ต์ํ๊ณ ์ฐธ๊ณ ์๋ฃ๊ฐ ํ๋ถํ Retrofit๊ณผ OkHttp๋ฅผ ์ ํํ์ต๋๋ค. ์ธ์ฆ ํค๋, ๊ธฐ๊ธฐ ์๋ณ์, ์ฑ ๋ฒ์ ๊ณผ ํ ํฐ ๊ฐฑ์ ์ ๋คํธ์ํฌ ๊ณ์ธต์์ ์ฒ๋ฆฌํ์ต๋๋ค.
๋ค๋ง ์ธํฐ์ ํฐ์์ ๋๊ธฐ์ ์ผ๋ก ์ธ์ฆ ์ํ์ ์ ๊ทผํ๋ ๊ตฌํ์ด ๋จ์๊ณ ์ด๋ฅผ ๋น๋๊ธฐ ํ๋ฆ๊ณผ ์์ ํ๊ฒ ๊ฒฐํฉํ๋ ๋ฆฌํฉํฐ๋ง์ ์๋ฃํ์ง ๋ชปํ์ต๋๋ค.
Glide์ Fresco ๋์ Compose ๋ฐ Kotlin๊ณผ์ ํตํฉ์ฑ์ด ๋์ Coil์ ์ฌ์ฉํ์ต๋๋ค. ์๊ฒฉ ์ด๋ฏธ์ง ๋ก๋ฉ์ Coil์ ์ฌ์ฉํ๊ณ ์ผ๋ถ ์๋ฆผ ์ธ๋ค์ผ์ placeholder์ error ์ด๋ฏธ์ง๋ฅผ ์ ์ฉํ์ต๋๋ค.
Feelin์ ๋์์ธ ์์คํ
์ Material ์์ ์ฒด๊ณ์ ๋ฌ๋์ต๋๋ค. ์ด๊ธฐ์๋ Material ์์ ์ฒด๊ณ์ ์์ฒด ํ ํฐ์ ๋์์ํค๋ ๋ฐฉ์์ ๊ณ ๋ คํ์ผ๋ ์ดํ CompositionLocal ๊ธฐ๋ฐ์ LocalFeelinColors๋ก ๋ธ๋๋ ํ ํฐ์ ๋ถ๋ฆฌํ์ต๋๋ค.
์ด ๊ตฌ์กฐ๋ก Compose ์ปดํฌ๋ํธ์ ๋ผ์ดํธยท๋คํฌ ๋ชจ๋๋ฅผ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ์ต๋๋ค. ๋ค๋ง NumberPicker๋ WebView์ฒ๋ผ View ์์คํ
ํ
๋ง์ ์ํฅ์ ๋ฐ๋ ์์์๋ ๋ณ๋ ๋์์ด ํ์ํ์ต๋๋ค.
๋จ์ผ ๋น๋ ํ๊ฒฝ๊ณผ ํ๋์ฝ๋ฉ๋ ์๋ฒ ์ฃผ์ยท์ธ๋ถ SDK ํค๋ฅผ dev, staging, prod flavor๋ก ๋ถ๋ฆฌํ์ต๋๋ค. ๊ฐ ํ๊ฒฝ์ ๋ณ๋์ Application ID, ์ฑ ์ด๋ฆ๊ณผ Kakao Native App Key๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ฒด ์๋ฒ ์๋ํฌ์ธํธ๋ dev์ staging์ด ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๊ณต์ ํ๊ณ prod๊ฐ ์ด์ ์๋ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CI๋ ๋ธ๋์น์ ๋ฐ๋ผ ๊ฐ๋ฐยท๊ฒ์ฆยท์ด์ variant๋ฅผ ๋น๋ํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค. ๋ค๋ง ์์ฒด ์๋ฒ๋ HTTPS๋ฅผ ์ง์ํ์ง ์์ API ํต์ ์ด ํ๋ฌธ HTTP์ ์์กดํ๋ค๋ ์ธ๋ถ ์ ์ฝ์ด ๋จ์์ต๋๋ค.
์ด๊ธฐ์๋ ๋์์ธ ์์คํ ๊ณผ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ํ๋ฉด์ ๋จผ์ ๊ตฌํํ๋ฉฐ Android ํ์ ์์ ๋ฐฉ์๊ณผ ์๋๋ฅผ ํ์ธํ์ต๋๋ค. ์ดํ ๋ก๊ทธ์ธ, ์จ๋ณด๋ฉ, ๋ง์ดํ์ด์ง UI๋ฅผ ๊ตฌ์ถํ๊ณ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ๋ ๋ฐฉํฅ์ผ๋ก ์งํํ์ต๋๋ค.
ํ์ง๋ง ๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์ , ๋ง์ดํ์ด์ง ์์ ์ด ์์๋ณด๋ค ์ค๋ ์ง์๋๊ณ ์๋ฒ ์ํ ๋ฐ API ์ ๊ทผ ๋ฌธ์ ๋ ์ค์ ์ฐ๋์ ์ง์ฐ์์ผฐ์ต๋๋ค. Android ํ ๋ด๋ถ์์๋ ๋ก๊ทธ์ธ ์๋ฃ๋ฅผ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ํ ์กฐ๊ฑด์ฒ๋ผ ๋ค๋ฃจ๋ฉด์ ์ ์ ํ ํ์ ์์ ์ ๋ฐฐ๋ถํ์ง ๋ชปํ๊ณ ํ๋ฉด์ด ์กด์ฌํ๋ ์ํ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ด ์์ฑ๋ ์ํ ์ฌ์ด์ ์ฐจ์ด๊ฐ ์ปค์ก๋ค๊ณ ํ๊ฐํ์ต๋๋ค.
์งํ์ ํ๋ณตํ๋ ค๊ณ ๋ค์ ๋ฐฉ์๋ค์ ๊ฒํ ํ์ต๋๋ค.
- ๋ชจ๋ ํ๋ฉด๊ณผ ๋ด๋น๊ฒ์ด์ ์ ๋ง๋ ๋ค API๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ์
- AI ์์ด์ ํธ๋ก ํ๋ฉด ๊ตฌํ ์๋๋ฅผ ๋์ธ ๋ค API๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ์
- ํ๋ฉด๋ณ ๊ณจ๊ฒฉ๊ณผ ์ ์ฒด ํ๋ฆ์ ๋จผ์ ์ฐ๊ฒฐํ๊ณ , ๊ฐ ํ๋ฉด์ API๋ฅผ ์์ฐจ์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ์
์ต์ข ์ ์ผ๋ก ์ธ ๋ฒ์งธ ๋ฐฉ์์ ์ค์ฌ์ผ๋ก ์ผ์์ผ๋ฉฐ ํ์๋ค์ด ํ๋ก์ ํธ์ ํฌ์ ํ ์ ์๋ ์๊ฐ์ด ์ค์ด๋ค๋ฉด AI ์์ด์ ํธ๋ฅผ ํ์ฉํ๋ ๋ฐฉํฅ์ ํํ์ต๋๋ค. ์ดํ ํ, ๋ ธํธ ์์ธยท์์ฑ, ์๋ฆผ, ์ ๊ณ , ์ฐจ๋จ ๋ฑ์ ํ๋ฉด๊ณผ ํ ์คํธ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ฅํ์ง๋ง ํ์๋ค์ ์ผ์ ๋ฌธ์ ์ ํ์ด ํ๋ก์ ํธ๋ฅผ ๊ณ์ ์ถ์งํ ๋๊ธฐ๊ฐ ๋ถ์กฑํ ์ํฉ๊ณผ ๊ฐ์ ๊ฐ๋ฐ ์ธ์ ๋ฌธ์ ๊น์ง ํด๊ฒฐํ์ง๋ ๋ชปํ์ต๋๋ค.
Detekt์ formatting ๋ฐ Compose ๊ท์น์ ๊ฒฐํฉํ๊ณ app/detekt.yml์ ์ ์ฅ์์ ์ฝ๋ ํ์ง ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ์ต๋๋ค. GitHub Actions์์๋ Detekt ์ ์ ๋ถ์๊ณผ ๋น๋ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ฐจ๋ก๋ก ๊ฒ์ฌํ์ต๋๋ค.
detekt
โโโ Build Check
โโโ ๋ชจ๋ PR ๋ฐ push: assembleDevDebug
โโโ develop push: assembleStagingDebug, assembleStagingRelease
โโโ main push: assembleProdDebug, assembleProdRelease
์ข ๋ฃ ์์ ์๋ ์๋ ํ ์คํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
- ์ธ์ฆ ๋ฐ ๋ก๊ทธ์ธ ์ค๋ฅ ๋ชจ๋ธ ๋จ์ ํ ์คํธ
- ์จ๋ณด๋ฉ ํ์๊ฐ์ ์ง๋ ฌํ ํ ์คํธ
- ํยท๋ ธํธ ์์ฑยท์๋ฆผ ViewModel ๋ฐ UI ์ํ ํ ์คํธ
- ๋ด๋น๊ฒ์ด์ ๋ชฉ์ ์ง ํ ์คํธ
- ๊ณตํต ๋ฒํผ๊ณผ ์ถ์์ฐ๋ ํผ์ปค Compose UI ํ ์คํธ
- ์๋ฆผ, ์ ๊ณ , ์ฐจ๋จ ์ฌ์ฉ์, ๊ด์ฌ ์ํฐ์คํธ ํ๋ฉด UI ํ ์คํธ
ํ๋ฐ๋ถ์๋ ์์ด์ ํฑ ์ฝ๋ฉ์ ๊ตฌํยท๊ฒ์ฆ ๊ณผ์ ์ ํ ์คํธ๋ฅผ ํฌํจํ๋ฉด์ ํ๋ฉด์ ๊ตฌํํ ๋ ๊ด๋ จ ํ ์คํธ๋ ํจ๊ป ์ถ๊ฐํ๋ ์์ ๋ฐฉ์์ ์ ์ฐฉ์์ผฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ์๋ฒ Repository๋ฅผ ๊ตฌํํ์ง ๋ชปํ ์์ญ์ด ๋ง์์ ์ ์ฒด ์ฌ์ฉ์ ํ๋ฆ์ ๊ฒ์ฆํ๋ ํตํฉ ํ ์คํธ๋ ๋ถ์กฑํฉ๋๋ค.
๊ฐ๋ฐ ์ข ๋ฃ ์์ ์ ๋ค์ ๋ฌธ์ ๊ฐ ๋จ์ ์์ต๋๋ค.
FeelinNavHost์ Scaffoldยท์ ์ญ ์ค๋ฒ๋ ์ด ์ฑ ์ ์ง์ค- OkHttp ์ธํฐ์
ํฐ์
runBlocking์ ๊ฑฐ ํ์ - ๋ง์ง๋ง ๋ก๊ทธ์ธ ๊ณต๊ธ์์ ๋ฉ๋ชจ๋ฆฌยท๋ก์ปฌ ์ํ ๋ถ์ผ์น
- ํ๋กํ ํ๋ฉด์ ํค๋ณด๋์ ์์คํ ๋ด๋น๊ฒ์ด์ ์ฌ๋ฐฑ ๋์
- ํ ํํฐ๊ฐ ์์ ์ ์ธ ์๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฌธ์
- WebView ๋ด๋ถ ์ฝํ
์ธ ์ ๋คํฌ ๋ชจ๋ ๋์ ๋ฏธ์๋ฃ.
NumberPicker์์ ๋ฐ์ํ ๋ฌธ์ ๋ก ์ธํด View ์์คํ ์ ๋คํฌ ๋ชจ๋ ๋์ ์ฝ๋๋ ์ถ๊ฐํ์ง๋ง ์ค์ ์ฝ๊ด ์ฝํ ์ธ ๊ฐ ๋คํฌ ๋ชจ๋์์ ์ด๋ป๊ฒ ๋ ๋๋ง๋๋์ง๋ ๊ฒ์ฆํ์ง ์์์ต๋๋ค. - ์ผ๋ถ ์ฒดํฌ๋ฐ์ค์ ๋คํฌ ๋ชจ๋ ๋ฏธ์ง์
- ๊ณตํต ๋ฒํผ๊ณผ ๋์์ธ ๋ช ์ธ์ ์ ํฉ์ฑ
- ์ด์์ฉ ์ฑ์ ์๋ช ํค์ ์๋ช ์ค์ ์ ๊ตฌ์ฑํ์ง ๋ชปํ์ต๋๋ค. ์ฑ ๊ธฐ๋ฅ์ ์์ฑํ ๋ค์ ์๋ช ํค๋ฅผ ํ ๋นํ๊ณ ๊ด๋ จ ์ค์ ์ ์ถ๊ฐํ ์์ ์ด์์ต๋๋ค.
- ๋คํธ์ํฌ์
App-Versionํค๋๊ฐBuildConfig.VERSION_NAME๋์1.0.3์ผ๋ก ๊ณ ์ ๋์ด ์์ต๋๋ค. ๊ฐ๋ฐ ์ค์๋ ์์ฒด ์๋ฒ๊ฐ ์ด๋ฏธ ์ง์ํ๋ iOS ์ฑ ๋ฒ์ ์ ํค๋์ ์ฌ์ฉํ๋๋ก ์ฐํํ์ต๋๋ค. - Access TokenยทRefresh TokenยทOAuth Token์ ๋ณ๋์ ์ํธํ ๊ณ์ธต ์์ด Preferences DataStore์ ์ ์ฅํฉ๋๋ค.
AuthManager์ Refresh Token ๊ธฐ๋ฐ ๋ก๊ทธ์ธ ์ํ์UserPreferencesDataStore์ ์จ๋ณด๋ฉ ์๋ฃ ์ํ๊ฐ ๋ณ๋๋ก ์กด์ฌํฉ๋๋ค.UserPreferencesDataStore๋ ๋์ ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํ ์์ ๊ตฌํ์ด์์ผ๋ฉฐ ์ฅ๊ธฐ์ ์ผ๋ก๋ ๋ก๊ทธ์ธ ์ํ๋ฅผAuthManager๊ธฐ๋ฐ์ผ๋ก ํตํฉํ ์์ ์ด์์ต๋๋ค.
์ด๋ฆฐ ์ด์๋ ํ์ ๊ตฌํ ๊ณํ์ด๋ผ๊ธฐ๋ณด๋ค, ํ๋ก์ ํธ๊ฐ ๋ฉ์ถ ์ง์ ๊ณผ ๋น์ ์ธ์ํ๊ณ ์๋ ํ๊ณ๋ฅผ ๋จ๊ธฐ๋ ๊ธฐ๋ก์ ๋๋ค.
Lyrics ํ ํ๋ก์ ํธ๊ฐ 2026๋ 8์ 10์ผ์ ์ข ๋ฃ๋๋ฉด์ Feelin Android ํด๋ผ์ด์ธํธ์ ๊ฐ๋ฐ๋ ๊ฐ์ ๋ ์ข ๋ฃ๋์ต๋๋ค. ์ข ๋ฃ ์์ ์๋ Android MVP๋ ์์ฑ๋์ง ์์์ต๋๋ค.
๊ฐ๋ฐ ์ค๋จ์๋ ๋ค์ ์์ธ์ด ํจ๊ป ์์ฉํ์ต๋๋ค.
- ํ๋ก์ ํธ ์ธ๋ ฅ ์ดํ
- ๋จ์ ํ์๋ค์ด ํ๋ก์ ํธ๋ฅผ ๊ณ์ ์ถ์งํ ๋งํ ์ถ๊ฐ ๋๊ธฐ๊ฐ ๋ถ์กฑํ์
- Android ์ฑ ๊ฐ๋ฐ์ด ์ฅ๊ธฐ๊ฐ ์ ์ฒด๋์
- ์๋ฒ ์ํ์ ๋ค๋ฅธ ํํธ์์ ์กฐ์จ์ ์์กดํ๋ ์์ ์ ์ง์ฐ
- ํต์ฌ ์ฌ์ฉ์ ํ๋ฆ์ ์์ง์ ์ผ๋ก ์์ฑํ๋ ์์ ๋ณด๋ค ๊ธฐ์ ๊ธฐ๋ฐ๊ณผ UI ๋ฒ์๋ฅผ ํ์ฅํ๋ ์์ ์ ๋จผ์ ์ถ์งํ ์ฐ์ ์์ ๋ฌธ์
ํ๋ก์ ํธ๋ Compose ๋์์ธ ์์คํ , ์ธ์ฆยท์ธ์ ํ๋ฆ, ํ๊ฒฝ ๋ถ๋ฆฌ, CI์ ํ ์คํธ ๊ธฐ๋ฐ์ ์ค์ ์ฝ๋๋ก ๋จ๊ฒผ์ต๋๋ค. ๋ฐ๋ฉด ์ด ๊ธฐ๋ฐ์ ํ์์ ๋ ธํธ ์์ฑ๊ณผ ์ํธ์์ฉ๊น์ง ์ด์ด์ง๋ ํ๋์ ์์ฑ๋ ์ฌ์ฉ์ ํ๋ฆ์ผ๋ก ์ฐ๊ฒฐํ์ง ๋ชปํ์ต๋๋ค. UI ๊ตฌํ๋ฅ ๊ณผ ์ค์ ๊ธฐ๋ฅ ์์ฑ๋๋ฅผ ๊ตฌ๋ถํ๊ณ ์์์ง๋ง ๊ทธ ์ฐจ์ด๋ฅผ ์งํ๋ฅ ๊ณผ ์์ ์ฐ์ ์์์ ์ถฉ๋ถํ ๋ฐ์ํ์ง ๋ชปํ ์ ๋ ๊ฐ๋ฐ ์ ์ฒด๋ฅผ ํค์ ์ต๋๋ค.
๊ฐ์ฅ ํฐ ๊ตํ์ ์ข์ ๊ธฐ์ ๊ธฐ๋ฐ๋ง์ผ๋ก MVP๊ฐ ์์ฑ๋์ง๋ ์๋๋ค๋ ์ ์ ๋๋ค. ์ด๋ฅผ ๋ณด์ํ๋ ค๋ฉด ์๋ ์คํ ์์น์ด ํจ๊ป ํ์ํ์ต๋๋ค.
- ๊ธฐ๋ฐ ์์ ๊ณผ ๋์์ ์ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ง ๊ธฐ๋ฅ์ ์๊ฒ ์์ฑํ ๊ฒ
- ์ธ๋ถ ํํธ์ ์์กดํ๋ ์์ ์ ์ธํฐํ์ด์ค ๊ณ์ฝ๊ณผ ํ ์คํธ ๋๋ธ์ ์ฌ์ฉํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์๊ฒ ๋ถ๋ฆฌํ ๊ฒ
- ํฐ ์ํฝ๋ณด๋ค ์งง์ ํผ๋๋ฐฑ ์ฃผ๊ธฐ๋ก ์๋ฃ ๊ฐ๋ฅํ ์์ ์ ์ฐ์ ํ ๊ฒ
- ํ์ ๊ฐ์ฉ ์ธ๋ ฅ๊ณผ ๋๊ธฐ๋ฅผ ๊ธฐ๋ฅ ๋ฒ์์ ์ง์์ ์ผ๋ก ๋ฐ์ํ ๊ฒ
์ด ์ ์ฅ์๋ ์์ฑ๋ ์ฑ์ ์ฑ๊ณต ์ฌ๋ก๋ ์๋๋๋ค. ๋์ ์ด์ ๊ฐ๋ฅํ Android ์ฑ์ ๋ง๋ค๊ธฐ ์ํด ์ค์ ๋ก ๋ด๋ฆฐ ๊ธฐ์ ์ ๊ฒฐ์ , ๊ทธ ๊ฒฐ์ ์ด ์ฝ๋์ ๋ฐ์๋ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ ํ ์์ฑ์ผ๋ก ์ฐ๊ฒฐํ์ง ๋ชปํ ์คํ์์ ํ๊ณ๋ฅผ ํจ๊ป ๊ธฐ๋กํฉ๋๋ค.
- Android Studio ๋ฐ Android SDK 36
- JDK 17
- Android 9(API 28) ์ด์์ ๊ธฐ๊ธฐ ๋๋ ์๋ฎฌ๋ ์ดํฐ
- ํ๊ฒฝ๋ณ Kakao Native App Key
์ ์ฅ์์ ์์ ํ์ผ์ ๋ณต์ฌํด local.properties๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
sdk.dir=/path/to/android/sdk
kakao.native.app.key.dev=YOUR_DEV_NATIVE_APP_KEY
kakao.native.app.key.staging=YOUR_STAGING_NATIVE_APP_KEY
kakao.native.app.key.prod=YOUR_PROD_NATIVE_APP_KEY๋น๋ํ๋ ค๋ flavor์ ํด๋นํ๋ Kakao Key๊ฐ ์์ผ๋ฉด ๋น๋๊ฐ ์คํจํฉ๋๋ค. ์ค์ ํค๋ ์ ์ฅ์์ ์ปค๋ฐํ์ง ๋ง์ธ์.
./gradlew :app:assembleDevDebug๋ค๋ฅธ ํ๊ฒฝ์ ๋ค์ variant๋ฅผ ์ฌ์ฉํฉ๋๋ค.
./gradlew :app:assembleStagingDebug
./gradlew :app:assembleProdDebug์์นด์ด๋น ์์ ์๋ ์์ฒด ์๋ฒ ์ฐ๊ฒฐ์ด ๋์ํ์ง ์์ผ๋ฉฐ ์ธ๋ถ ์๋น์ค๋ ์ดํ ์ค๋จ๋ ์ ์์ผ๋ฏ๋ก, ๋น๋ ์ฑ๊ณต์ด ๋ก๊ทธ์ธ์ด๋ API ๊ธฐ๋ฅ์ ์ค์ ๋์์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
./gradlew detekt
./gradlew :app:testDevDebugUnitTest์ด ์ ์ฅ์์๋ Android ํ์ด ์ํํ ๋ค์ ์์ ์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋จ์ ์์ต๋๋ค.
- Android ์ฑ ๊ตฌ์กฐ ๋ฐ Gradle ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ
- Compose ํ๋ฉด๊ณผ ๊ณตํต ๋์์ธ ์์คํ ๊ตฌํ
- ์ธ์ฆ, ์ธ์ ๊ด๋ฆฌ ๋ฐ ๋ก์ปฌ ์ ์ฅ์ ์ฐ๋
- ๊ธฐ๋ฅ๋ณ ์ํ์ ๋ด๋น๊ฒ์ด์ ๊ตฌ์ฑ
- CI, ์ ์ ๋ถ์ ๋ฐ ์๋ํ ํ ์คํธ ๋์
- Android ๊ธฐ๋ฅ ๋ช ์ธ์ ๊ฐ๋ฐ ๊ธฐ๋ก ์ ๋ฆฌ
์ด ๋ฌธ์๋ Android ์ ์ฅ์์ ๊ธฐ์ ์ ๊ธฐ๋ก๋ง ๋ค๋ฃจ๋ฉฐ Feelin ์ ์ฒด ํ์ ์ญํ ์ด๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธยท์๋ฒ์ ๊ธฐ์ฌ๋ฅผ ์ ๋ฆฌํ์ง ์์ต๋๋ค.