Skip to content
This repository was archived by the owner on Sep 18, 2026. It is now read-only.

Latest commit

ย 

History

501 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Feelin Android

์ด ์ €์žฅ์†Œ๋Š” 2026๋…„ 8์›” 10์ผ๋ถ€๋กœ ๊ฐœ๋ฐœ์„ ์ข…๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.

Android MVP๋ฅผ ์™„์„ฑํ•˜์ง€ ๋ชปํ•œ ์ƒํƒœ์—์„œ ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฉฐ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๊ณ„ํš์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” Feelin Android๊ฐ€ ๋ชฉํ‘œ๋กœ ํ–ˆ๋˜ ๊ธฐ์ˆ ์  ๋ฐฉํ–ฅ, ์‹ค์ œ ๊ตฌํ˜„ ๋ฒ”์œ„์™€ ํ•œ๊ณ„๋ฅผ ๊ธฐ๋กํ•˜๊ณ ์ž ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

Feelin์€ ์ธ๋”” ์Œ์•…์„ ์ค‘์‹ฌ์œผ๋กœ, ์ธ์ƒ ๊นŠ์€ ๊ฐ€์‚ฌ์™€ ์Œ์•…์— ๋Œ€ํ•œ ๊ฐ์ƒ์„ ๊ธฐ๋กํ•˜๊ณ  ๊ฐ™์€ ์•„ํ‹ฐ์ŠคํŠธ๋ฅผ ์ข‹์•„ํ•˜๋Š” ์‚ฌ์šฉ์ž๋“ค๊ณผ ์†Œํ†ตํ•˜๋„๋ก ๊ธฐํš๋œ ์Œ์•… ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค.

์ด ์ €์žฅ์†Œ๋Š” ๊ธฐ์กด Feelin ์„œ๋น„์Šค๋ฅผ Android๋กœ ํ™•์žฅํ•˜๋ ค๊ณ  ๊ฐœ๋ฐœํ•œ ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด iOS ์•ฑ์˜ ๊ธฐ๋Šฅ๋งŒ ๋น ๋ฅด๊ฒŒ ์žฌํ˜„ํ•˜๋Š” ํฌํŠธํด๋ฆฌ์˜ค ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ถœ์‹œ ์ดํ›„์—๋„ ์šด์˜ํ•  Android ์•ฑ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ด€๋ จ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์Œ“๋Š” ๊ฒƒ์„ ์ดˆ๊ธฐ ๋ชฉํ‘œ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธ์ฆ๊ณผ ์•ฑ ์šด์˜ ๊ธฐ๋ฐ˜์€ ์ฝ”๋“œ ์—ฐ๋™๊นŒ์ง€ ๊ตฌํ˜„ํ•œ ๋ฐ˜๋ฉด, ๋‹ค์ˆ˜์˜ ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ์€ UIยท์ƒํƒœยท๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„ ๋‹จ๊ณ„์— ๋จธ๋ฌผ๋ €์Šต๋‹ˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ์ธ๋ ฅ ์ดํƒˆ, ํŒ€ ๋‚ด๋ถ€์˜ ์ถ”๊ฐ€ ๋™๊ธฐ ๋ถ€์กฑ, Android ์•ฑ ๊ฐœ๋ฐœ์˜ ์žฅ๊ธฐ์ ์ธ ์ •์ฒด๊ฐ€ ๊ฒน์น˜๋ฉด์„œ MVP๋ฅผ ์™„์„ฑํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ข…๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.

Android ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์ˆ ์  ๋ชฉํ‘œ

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 ๋กœ๊ทธ์ธ๋ถ€ํ„ฐ ์„œ๋ฒ„ ์ธ์ฆ๊ณผ ์„ธ์…˜ ๊ด€๋ฆฌ๋กœ ์ด์–ด์ง€๋Š” ํ๋ฆ„์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

UIยท์ƒํƒœยท๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„

๋‹ค์Œ ์˜์—ญ์€ ํ™”๋ฉด๊ณผ ์‚ฌ์šฉ์ž ํ๋ฆ„, ์ผ๋ถ€ 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"]
Loading

์ด ํ๋ฆ„์€ ์ธ์ฆ ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉฐ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ ๋Œ€๋ถ€๋ถ„ 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 ์ฑ„ํƒ

๊ธฐ์กด XML ์•ฑ์„ ์ „ํ™˜ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์šด์˜์„ ๋ชฉํ‘œ๋กœ ํ•œ ์‹ ๊ทœ ์•ฑ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝํ—˜ ์ž์ฒด๋ฅผ ๋ชฉํ‘œ๋กœ ์‚ผ์ง€ ์•Š๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ Compose๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ, ์ƒํƒœ ๊ธฐ๋ฐ˜ UI, ๋ผ์ดํŠธยท๋‹คํฌ ํ”„๋ฆฌ๋ทฐ์™€ Compose UI ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

Google ๊ถŒ์žฅ ์•ฑ ์•„ํ‚คํ…์ฒ˜์™€ MVVM

์—„๊ฒฉํ•œ Clean Architecture์™€ MVI๋„ ๊ฒ€ํ† ํ–ˆ์ง€๋งŒ ์•ฑ ์ œ์ž‘๊ณผ ์šด์˜ ์ผ์ •์— ๋” ํ˜„์‹ค์ ์ธ Google ๊ถŒ์žฅ ์•ฑ ์•„ํ‚คํ…์ฒ˜์™€ MVVM์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ Intent๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๋น„์šฉ์„ ์ค„์ด๊ณ  ViewModel๊ณผ StateFlow๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ธ์ฆ ์˜์—ญ์ฒ˜๋Ÿผ ์„œ๋ฒ„์™€ ์—ฐ๋™๋œ ๊ธฐ๋Šฅ์€ ์ฑ…์ž„์ด ๋น„๊ต์  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋์ง€๋งŒ ์ผ๋ถ€ ์ „์—ญ UI์™€ ๋‚ด๋น„๊ฒŒ์ด์…˜์— ๊ด€ํ•œ ์ฑ…์ž„์€ ํ•œ ํŒŒ์ผ์— ์ง‘์ค‘๋์Šต๋‹ˆ๋‹ค.

Hilt ์„ ํƒ

Koin๊ณผ ๋น„๊ตํ•œ ๋’ค ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์ฆ์„ ์ œ๊ณตํ•˜๋Š” Hilt๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ๋Ÿฐํƒ€์ž„์— ์˜์กด์„ฑ ๊ตฌ์„ฑ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ์ƒํ™ฉ์„ ์ค„์ด๊ณ ์ž ํ–ˆ์œผ๋ฉฐ DataStore, Repository, Retrofit๊ณผ ์ธ์ฆ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Retrofit๊ณผ OkHttp ์„ ํƒ

Ktor ๋Œ€์‹  ํŒ€์ด ์ต์ˆ™ํ•˜๊ณ  ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ํ’๋ถ€ํ•œ Retrofit๊ณผ OkHttp๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ ํ—ค๋”, ๊ธฐ๊ธฐ ์‹๋ณ„์ž, ์•ฑ ๋ฒ„์ „๊ณผ ํ† ํฐ ๊ฐฑ์‹ ์„ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์—์„œ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ธ์ฆ ์ƒํƒœ์— ์ ‘๊ทผํ•˜๋Š” ๊ตฌํ˜„์ด ๋‚จ์•˜๊ณ  ์ด๋ฅผ ๋น„๋™๊ธฐ ํ๋ฆ„๊ณผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์€ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Coil ์„ ํƒ

Glide์™€ Fresco ๋Œ€์‹  Compose ๋ฐ Kotlin๊ณผ์˜ ํ†ตํ•ฉ์„ฑ์ด ๋†’์€ Coil์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ์— Coil์„ ์‚ฌ์šฉํ–ˆ๊ณ  ์ผ๋ถ€ ์•Œ๋ฆผ ์ธ๋„ค์ผ์— placeholder์™€ error ์ด๋ฏธ์ง€๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Material๊ณผ ๋ธŒ๋žœ๋“œ ๋””์ž์ธ ํ† ํฐ ๋ถ„๋ฆฌ

Feelin์˜ ๋””์ž์ธ ์‹œ์Šคํ…œ์€ Material ์ƒ‰์ƒ ์ฒด๊ณ„์™€ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” Material ์ƒ‰์ƒ ์ฒด๊ณ„์— ์ž์ฒด ํ† ํฐ์„ ๋Œ€์‘์‹œํ‚ค๋Š” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ–ˆ์œผ๋‚˜ ์ดํ›„ CompositionLocal ๊ธฐ๋ฐ˜์˜ LocalFeelinColors๋กœ ๋ธŒ๋žœ๋“œ ํ† ํฐ์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ๋กœ Compose ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํŠธยท๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ NumberPicker๋‚˜ WebView์ฒ˜๋Ÿผ View ์‹œ์Šคํ…œ ํ…Œ๋งˆ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์š”์†Œ์—๋Š” ๋ณ„๋„ ๋Œ€์‘์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ๋ณ„ Product Flavor

๋‹จ์ผ ๋นŒ๋“œ ํ™˜๊ฒฝ๊ณผ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์„œ๋ฒ„ ์ฃผ์†Œยท์™ธ๋ถ€ 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 ์—์ด์ „ํŠธ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ํ™ˆ, ๋…ธํŠธ ์ƒ์„ธยท์ž‘์„ฑ, ์•Œ๋ฆผ, ์‹ ๊ณ , ์ฐจ๋‹จ ๋“ฑ์˜ ํ™”๋ฉด๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์žฅํ–ˆ์ง€๋งŒ ํŒ€์›๋“ค์˜ ์ผ์ • ๋ฌธ์ œ์™€ ํŒ€์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„์† ์ถ”์ง„ํ•  ๋™๊ธฐ๊ฐ€ ๋ถ€์กฑํ•œ ์ƒํ™ฉ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ ์™ธ์  ๋ฌธ์ œ๊นŒ์ง€ ํ•ด๊ฒฐํ•˜์ง€๋Š” ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ’ˆ์งˆ ๊ด€๋ฆฌ

์ •์  ๋ถ„์„๊ณผ CI

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๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•œ ์˜์—ญ์ด ๋งŽ์•„์„œ ์ „์ฒด ์‚ฌ์šฉ์ž ํ๋ฆ„์„ ๊ฒ€์ฆํ•˜๋Š” ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ ค์ง„ ๊ธฐ์ˆ  ๋ถ€์ฑ„

๊ฐœ๋ฐœ ์ข…๋ฃŒ ์‹œ์ ์— ๋‹ค์Œ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๋ฆฐ ์ด์Šˆ๋Š” ํ›„์† ๊ตฌํ˜„ ๊ณ„ํš์ด๋ผ๊ธฐ๋ณด๋‹ค, ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฉˆ์ถ˜ ์ง€์ ๊ณผ ๋‹น์‹œ ์ธ์‹ํ•˜๊ณ  ์žˆ๋˜ ํ•œ๊ณ„๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์ค‘๋‹จ๊ณผ ํšŒ๊ณ 

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 ํŒ€์ด ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Android ์•ฑ ๊ตฌ์กฐ ๋ฐ Gradle ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  • Compose ํ™”๋ฉด๊ณผ ๊ณตํ†ต ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • ์ธ์ฆ, ์„ธ์…˜ ๊ด€๋ฆฌ ๋ฐ ๋กœ์ปฌ ์ €์žฅ์†Œ ์—ฐ๋™
  • ๊ธฐ๋Šฅ๋ณ„ ์ƒํƒœ์™€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ตฌ์„ฑ
  • CI, ์ •์  ๋ถ„์„ ๋ฐ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ๋„์ž…
  • Android ๊ธฐ๋Šฅ ๋ช…์„ธ์™€ ๊ฐœ๋ฐœ ๊ธฐ๋ก ์ •๋ฆฌ

์ด ๋ฌธ์„œ๋Š” Android ์ €์žฅ์†Œ์˜ ๊ธฐ์ˆ ์  ๊ธฐ๋ก๋งŒ ๋‹ค๋ฃจ๋ฉฐ Feelin ์ „์ฒด ํŒ€์˜ ์—ญํ• ์ด๋‚˜ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธยท์„œ๋ฒ„์˜ ๊ธฐ์—ฌ๋ฅผ ์ •๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๊ธฐ๋ก

About

๐ŸŽต Lyrics's Android App Repository

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages