์์ ๋ด์ฅํ(Offline-First) ยท Kotlin ์
๋ฌธ์ ๊ธฐ์ค ยท ํด๋ผ์ฐ๋ ๋น์ฉ $0
MacBook Pro 14 M2 Pro ยท Android Studio + Kotlin + Room DB
โ ์์ ์คํ๋ผ์ธ โ ์ธํฐ๋ทยทํด๋ผ์ฐ๋ ์์ด ์ฑ์ด 100% ์๋ํ๋ค
โก ๋น์ฉ $0 โ Play Store ๋ฑ๋ก๋น $25 ์ธ ์ถ๊ฐ ์๋ฒยท๊ตฌ๋
๋น์ฉ ์์
โข Kotlin ์์ ์
๋ฌธ์ ๊ธฐ์ค โ ์๋ ๊ฒ ์์ด๋ ์์๋๋ก ๋ฐ๋ผ๊ฐ๋ฉด ์ฑ์ด ๋์จ๋ค
Phase 0
0 ~ 2์ฃผ | Kotlin ๋ง๋ณด๊ธฐ (์ฌ์ ์ค๋น)
โข ๋ณ์ยทํ์
ยท์กฐ๊ฑด๋ฌธยทํจ์ ๋ฑ ์ด๊ฒ๋ง ๋จผ์
โข ์๋๋ก์ด๋ ์์ด ์น์์ ๋ฐ๋ก ์ฐ์ต (play.kotlinlang.org)
โข Hello World ํ๋ ์ถ๋ ฅํด๋ณด๊ธฐ |
Phase 1
1์ฃผ | Android Studio ์ธํ
โข Android Studio ์ค์น ยท ์ฒซ ํ๋ก์ ํธ ์์ฑ
โข ์ค์ ์๋๋ก์ด๋ ๊ธฐ๊ธฐ ์ฐ๊ฒฐ ยท ์ฑ ์คํ ํ์ธ
โข ํ๋ก์ ํธ ํด๋ ๊ตฌ์กฐ ์ดํด |
Phase 2
2 ~ 3์ฃผ | Kotlin ํต์ฌ๋ง ๋น ๋ฅด๊ฒ
โข ํด๋์ค ยท ๋ฐ์ดํฐ ํด๋์ค ยท ๋ ์์ ์ฑ
โข ์ปฌ๋ ์
(ListยทMap) ยท ๋๋ค
โข Coroutine ๊ธฐ์ด (๋น๋๊ธฐ ์ฒ๋ฆฌ) |
Phase 3
3 ~ 4์ฃผ | UI ํ๋ฉด ๋ง๋ค๊ธฐ (Compose)
โข ํ ํ๋ฉด ยท CS ์นด๋ ํ๋ฉด ยท ํด์ฆ ํ๋ฉด
โข ํ๋ฉด ์ด๋(Navigation) ๊ตฌํ
โข ๋คํฌ๋ชจ๋ ยท ํฐํธ ยท ํ
๋ง ์ค์ |
Phase 4
2 ~ 3์ฃผ | ์์ ์คํ๋ผ์ธ ๋ฐ์ดํฐ ๊ตฌ์ถ
โข CS ์ฝํ
์ธ JSON ํ์ผ๋ก ์์ฑ (assets ํด๋)
โข Room DB ์ค๊ณ ยท ์ฒซ ์คํ ์ DB ์ด์
โข ํ์ต ์ง๋ ยท ์ฆ๊ฒจ์ฐพ๊ธฐ ยท ํด์ฆ ๊ธฐ๋ก ์ ์ฅ |
Phase 5
2์ฃผ | ์์ตํ & ์ถ์
โข Freemium ์ ๊ธ ๋ก์ง ๊ตฌํ (ํด๋ผ์ฐ๋ ์์ด)
โข Google Play Console ๋ฑ๋ก ยท ๋ฒ ํ ์ถ์
โข ์ ์ ์ถ์ & ์ฝํ
์ธ ์
๋ฐ์ดํธ ์ด์ ๋ฐฉ์ |
Firebaseยท์๋ฒ ์์ด ์ฑ ํ๋๋ง์ผ๋ก ๋ชจ๋ ๊ฒ ๋์ํ๋ ๋ฐฉ์์
๋๋ค.
CS ๋ฐ์ดํฐ๋ ์ฑ ์ค์น ํ์ผ ์์ ์ฒ์๋ถํฐ ํฌํจ๋์ด ์๊ณ , ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ ๊ธฐ๊ธฐ ๋ด๋ถ DB์๋ง ์ ์ฅ๋ฉ๋๋ค.
๋ฐ์ดํฐ ํ๋ฆ ํ๋์ ๋ณด๊ธฐ
โ APK ์์ assets/cs_data.json ํ์ผ ์ฝ๊ธฐ
โก Room DB(๊ธฐ๊ธฐ ๋ด๋ถ ์ ์ฅ์)์ CS ๊ฐ๋
์ ์ฒด ์ด์
โข ์ดํ ์ธํฐ๋ท ์ฐ๊ฒฐ ์์ด๋ ๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ๋ฅ
โข
CS ๊ฐ๋
์นด๋ ์ฝ๊ธฐ โ Room DB์์ ์ฆ์ ์กฐํ
โข
ํด์ฆ ํ๊ธฐ โ ๊ฒฐ๊ณผ Room DB์ ์ ์ฅ
โข
์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ๊ฐ โ Room DB์ ์ ์ฅ
โข
ํ์ต ์ง๋ โ Room DB์ ์ ์ฅ
โ ์ธํฐ๋ท 0% ํ์
โข
cs_data.json ํ์ผ์ ์ ๊ฐ๋
์ถ๊ฐ
โข
Play Store์ ์ ๋ฒ์ ์ฑ ๋ฐฐํฌ
โข
์ฌ์ฉ์๊ฐ ์
๋ฐ์ดํธํ๋ฉด ์๋์ผ๋ก ์ ๋ฐ์ดํฐ ์ ์ฉ
โ ์๋ฒ ์์ด ์ฑ ์
๋ฐ์ดํธ = ์ฝํ
์ธ ์
๋ฐ์ดํธ
Firebase vs ์์ ๋ด์ฅํ ๋น๊ต
๊ธฐ๋ฅ | Firebase ๋ฐฉ์ | ์์ ๋ด์ฅํ (์ฐ๋ฆฌ ๋ฐฉ์) |
CS ๋ฐ์ดํฐ ์ ์ฅ | Firestore (ํด๋ผ์ฐ๋) | assets/JSON โ Room DB (๊ธฐ๊ธฐ ๋ด) |
์ฌ์ฉ์ ์ง๋ ์ ์ฅ | Firestore (ํด๋ผ์ฐ๋) | Room DB (๊ธฐ๊ธฐ ๋ด) |
์ฝํ
์ธ ์
๋ฐ์ดํธ | ์ค์๊ฐ ๋ฐ์ | ์ฑ ์
๋ฐ์ดํธ๋ก ๋ฐ์ |
์ธํฐ๋ท ํ์ ์ฌ๋ถ | ํญ์ ํ์ | ์ค์น ํ ๋ถํ์ |
์ ๋น์ฉ | $0~์์ญ ๋ฌ๋ฌ | $0 (์๊ตฌ ๋ฌด๋ฃ) |
๋ก๊ทธ์ธ ํ์ | ํ์ (Firebase Auth) | ๋ถํ์ |
๋ณต์ก๋ | ๋์ (SDK ์ค์ ๋ณต์ก) | ๋ฎ์ (Room๋ง ๋ฐฐ์ฐ๋ฉด ๋จ) |
Kotlin์ ์ ํ ๋ชจ๋ฅธ๋ค๋ฉด ์ฌ๊ธฐ์ ์์ํ์ธ์. Android Studio ์ค์น ์ ์ ์น์์ ๋ฐ๋ก ์ฐ์ตํฉ๋๋ค.
1. ๋ธ๋ผ์ฐ์ ์์ play.kotlinlang.org ์ ์
2. ์ผ์ชฝ ์์ ์ฝ๋ ์ง์ฐ๊ณ ์ง์ ํ์ดํ
3.
Run ๋ฒํผ ํด๋ฆญ โ ๊ฒฐ๊ณผ ํ์ธ
โ ์ด๊ฒ๋ง์ผ๋ก Kotlin ๊ธฐ์ด ์์ ํ ์ตํ ์ ์์
Phase 0 ํ์ต ์์ (๋ฑ ์ด๊ฒ๋ง)
STEP 1 ยท ๋ณ์ (val / var)
val = ํ๋ฒ ์ ํ๋ฉด ๋ชป ๋ฐ๊ฟ / var = ๋์ค์ ๋ฐ๊ฟ ์ ์์
โ CS ๊ฐ๋
์ ๋ชฉ์ฒ๋ผ ๋ฐ๋์ง ์๋ ๊ฑด val, ํ์ต ์ ์์ฒ๋ผ ๋ฐ๋๋ ๊ฑด var
STEP 2 ยท ์กฐ๊ฑด๋ฌธ (if / when)
โ when์ Java์ switch์ ๊ฐ์๋ฐ, Kotlin์์ ํจ์ฌ ๊ฐ๊ฒฐํ๊ฒ ์๋๋ค
โ ํด์ฆ ์ ๋ต ํ๋จ, ์นดํ
๊ณ ๋ฆฌ ๋ถ๋ฅ ๋ฑ์ ๋ฐ๋ก ์ฐ์
STEP 3 ยท ๋ฐ๋ณต๋ฌธ (for / forEach)
โ CS ๊ฐ๋
๋ชฉ๋ก ์ ์ฒด๋ฅผ ํ๋ฉด์ ๋ฟ๋ฆด ๋ ์ฌ์ฉ
STEP 4 ยท ํจ์ (fun)
โ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ๋ฌถ์ด์ ์ด๋ฆ ๋ถ์ด๊ธฐ
โ ์ฑ์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ํจ์ ๋จ์๋ก ๊ตฌ์ฑ๋จ
STEP 5 ยท ๋ ์์ ์ฑ (? ์ ?:)
โ Kotlin์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
์ค ํ๋
โ ์ฑ์ด ๊ฐ์๊ธฐ ๊บผ์ง๋ ์ค๋ฅ(NullPointerException)๋ฅผ ์ธ์ด ์ฐจ์์์ ๋ง์์ค
โข
STEP 1~3 : ํ๋ฃจ 30๋ถ์ฉ 3์ผ โ ์๋ฃ
โข
STEP 4~5 : ํ๋ฃจ 30๋ถ์ฉ 3์ผ โ ์๋ฃ
โข
Kotlin Koans (play.kotlinlang.org) 1~20๋ฒ ํ๊ธฐ โ 1์ฃผ ์์ฑ
โ ์ด ์ ๋๋ฉด Android Studio์์ ์ฝ๋ ์ฝ๊ณ ์ดํดํ๋ ๋ฐ ์ถฉ๋ถ
์ค์น ์ ์ฐจ (M2 Mac ๊ธฐ์ค)
1.
developer.android.com/studio ์ ์
2.
Mac with Apple chip (.dmg) ๋ค์ด๋ก๋ โ ๋ฐ๋์ Apple Silicon ๋ฒ์ ์ ํ
3.
.dmg ์ด๊ธฐ โ Android Studio๋ฅผ Applications ํด๋๋ก ๋๋๊ทธ
4.
์ฒซ ์คํ โ Setup Wizard โ Standard ์ค์น โ SDK ์๋ ๋ค์ด๋ก๋ (์ฝ 10~20๋ถ)
5.
์ค์น ์๋ฃ ํ New Project โ Empty Activity ์ ํ
์ฒซ ํ๋ก์ ํธ ์ค์ ๊ฐ
ํญ๋ชฉ | ์
๋ ฅ๊ฐ | ์ด์ |
Name | CSStudyApp | ํ๋ก์ ํธ ์ด๋ฆ |
Package name | com.yourname.csstudyapp | ์ฑ ๊ณ ์ ์๋ณ์ |
Language | Kotlin | ํ์ |
Minimum SDK | API 26 (Android 8.0) | ๊ตญ๋ด ๊ธฐ๊ธฐ 95% ์ด์ ์ปค๋ฒ |
Build configuration | Kotlin DSL | ์ต์ ํ์ค ๋ฐฉ์ |
1. ์๋๋ก์ด๋ ํฐ โ ์ค์ โ ํด๋ํฐ ์ ๋ณด โ ๋น๋ ๋ฒํธ 7๋ฒ ํญ
2. ๊ฐ๋ฐ์ ์ต์
ํ์ฑํ โ USB ๋๋ฒ๊น
ON
3. USB๋ก Mac์ ์ฐ๊ฒฐ โ Android Studio ์๋จ์ ๊ธฐ๊ธฐ ์ด๋ฆ ํ์
4.
Run ๋ฒํผ โ ํฐ์ ์ฑ ์ค์น ยท ์คํ ํ์ธ
์
๋ฌธ์ ๊ธฐ์ค์ผ๋ก ์ฑ ๊ฐ๋ฐ์ ๊ผญ ํ์ํ ๊ฒ๋ง ๊ณจ๋์ต๋๋ค. ์ ๋ถ ๋ค ์ ํ์ ์์ด์.
๊ผญ ์์์ผ ํ๋ ๊ฒ vs ๋์ค์ ๋ด๋ ๋๋ ๊ฒ
์ฃผ์ | ์ค์๋ | ์ด์ |
val / var ยท ๊ธฐ๋ณธ ํ์
| ๋ชจ๋ ์ฝ๋์ ๊ธฐ๋ณธ | |
if ยท when ยท for | ๋ก์ง ํ๋ฆ ์ ์ด | |
fun (ํจ์) | ๊ธฐ๋ฅ ๋จ์ ๊ตฌ์ฑ | |
data class | CS ๊ฐ๋
๋ฐ์ดํฐ ๋ชจ๋ธ | |
List ยท Map ยท filter | ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ | |
๋ ์์ ์ฑ (? ยท ?:) | ์ฑ ์์ ์ฑ | |
Coroutine (launch ยท suspend) | DB ์ ์ฅ ์ ํ์ | |
sealed class ยท enum | ์ํ ๊ด๋ฆฌ | |
generics ยท ๊ณ ๊ธ ํ์
| ์ฒ์์ ๋ชฐ๋ผ๋ ๋จ | |
Java ์ํธ์ด์ฉ | ์ง๊ธ ๋น์ฅ ๋ถํ์ |
์ฃผ์ฐจ๋ณ ํ์ต ๊ณํ
1์ฃผ์ฐจ โ ์ธ์ด ๊ธฐ์ด (Phase 0 ๋ณต์ต + ์ฌํ)
โข
val ยท var ์๋ฒฝ ์ดํด, String ํ
ํ๋ฆฟ ($๋ณ์๋ช
) ํ์ฉ
โข
when ํํ์์ผ๋ก ํด์ฆ ์ ๋ต ํ๋จ ๋ก์ง ์ง์ ์ง๋ณด๊ธฐ
โข
for๋ฌธ์ผ๋ก CS ๊ฐ๋
๋ฆฌ์คํธ ์ถ๋ ฅํด๋ณด๊ธฐ
2์ฃผ์ฐจ โ ๋ฐ์ดํฐ ๋ชจ๋ธ ์ค๊ณ
โข
data class๋ก CS ๊ฐ๋
๋ชจ๋ธ ์ง์ ๋ง๋ค๊ธฐ
โฆ
์์: data class CsConcept(val id: Int, val title: String, val description: String, val category: String)
โข
List<CsConcept>๋ก ๋ฐ์ดํฐ ๋ฌถ๊ธฐ ยท filter๋ก ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ฒ์
โข
nullable(?) ์ฒ๋ฆฌํด์ ์์ ํ ์ฝ๋ ์์ฑ ์ฐ์ต
3์ฃผ์ฐจ โ Coroutine ๊ธฐ์ด (Room DB ์ฌ์ฉ ์ ํ์)
โข
์ ํ์ํ๊ฐ: DB ์ฝ๊ธฐ/์ฐ๊ธฐ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ๋ฆฌํด์ผ ํจ
โข
launch { } ๋ธ๋ก ์์์ DB ์์
ํ๋ ํจํด ์ดํด
โข
suspend fun ์ด ๋ถ์ ํจ์๋ ๊ธฐ๋ค๋ ค์ค์ผ ํ๋ค๋ ๊ฒ๋ง ์๋ฉด ์ถฉ๋ถ
โข
๋ฌธ๋ฒ ์๊ธฐ๋ณด๋ค '์ง์ ์ณ๋ณด๊ธฐ'๊ฐ 10๋ฐฐ ํจ์จ์ โ play.kotlinlang.org์์ ๋ฐ๋ก ์คํ
โข
์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฌด์์ํ์ง ๋ง์ธ์ โ ์ค๋ฅ๊ฐ ๋์ผ ๋ฐฐ์๋๋ค
โข
๊ตฌ๊ธ ๊ฒ์ํ ๋ 'Kotlin [๋ชจ๋ฅด๋ ๊ฒ] example'๋ก ๊ฒ์ํ๋ฉด ์์ ์ฝ๋ ๋ฐ๋ก ๋์ด
โข
ChatGPT/Claude์๊ฒ '์ด ์ฝ๋ ํ๊ตญ์ด๋ก ์ค๋ช
ํด์ค'๋ผ๊ณ ๋ฌผ์ด๋ณด๋ ๊ฒ๋ ๋งค์ฐ ํจ๊ณผ์
Compose๋ XML ์์ด Kotlin ์ฝ๋๋ง์ผ๋ก ํ๋ฉด์ ๋ง๋๋ ์ต์ ๋ฐฉ์์
๋๋ค. ์
๋ฌธ์์๊ฒ ๋ ์ง๊ด์ ์ด์์.
๋ง๋ค์ด์ผ ํ ํ๋ฉด ๋ชฉ๋ก (์ฐ์ ์์์)
ํ๋ฉด | ์ฃผ์ ๊ธฐ๋ฅ | ๋์ด๋ | ์ฐ์ ์์ |
ํ ํ๋ฉด | ์นดํ
๊ณ ๋ฆฌ ๋ชฉ๋ก ยท ํ์ต ์ง๋ ์์ฝ | ||
CS ์นด๋ ํ์ต | ๊ฐ๋
์นด๋ ๋๊ธฐ๊ธฐ ยท ์/๋ท๋ฉด ๋ค์ง๊ธฐ | ||
ํด์ฆ ํ๋ฉด | ๊ฐ๊ด์ 4์ง์ ๋ค ยท ๊ฒฐ๊ณผ ํ์ | ||
์ฆ๊ฒจ์ฐพ๊ธฐ | ๋ถ๋งํฌ ๋ชฉ๋ก ๋ชจ์๋ณด๊ธฐ | ||
๊ฒ์ | ํค์๋ ๊ฒ์ ยท ์ค์๊ฐ ํํฐ | ||
์ค์ | ๋คํฌ๋ชจ๋ ยท ์๋ฆผ ์ค์ |
ํด๋ ๊ตฌ์กฐ (์ฒ์๋ถํฐ ์ด๋๋ก ๋ง๋์ธ์)
app/src/main/
โโโ assets/
โ โโโ cs_data.json โ CS ๊ฐ๋
๋ฐ์ดํฐ ํ์ผ (ํต์ฌ!)
โโโ java/com.yourname.csstudyapp/
โโโ data/
โ โโโ CsConceptEntity.kt โ Room DB ํ
์ด๋ธ ์ ์
โ โโโ CsConceptDao.kt โ DB ์กฐํยท์ ์ฅ ์ฟผ๋ฆฌ
โ โโโ CsDatabase.kt โ DB ์ธ์คํด์ค
โ โโโ CsRepository.kt โ UI
๏ธ DB ์ค๊ฐ ๊ด๋ฆฌ
โโโ ui/
โ โโโ home/HomeScreen.kt
โ โโโ card/CardScreen.kt
โ โโโ quiz/QuizScreen.kt
โ โโโ theme/Theme.kt
โโโ viewmodel/
โ โโโ CsViewModel.kt โ ํ๋ฉด ์ํ ๊ด๋ฆฌ
โโโ MainActivity.kt
์ด ํํธ๊ฐ ์ด ์ฑ์ ํต์ฌ์
๋๋ค. ์ธํฐ๋ท ์์ด CS ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๊ธฐ์ ๋ด์ฅํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช
ํฉ๋๋ค.
STEP 1 ยท CS ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์์ฑ
assets/cs_data.json ํ์ผ์ ๋ชจ๋ CS ๊ฐ๋
์ ์๋ ํ์์ผ๋ก ์์ฑํฉ๋๋ค.
[
{
"id": 1,
"title": "์คํ (Stack)",
"description": "LIFO(Last In First Out) ๊ตฌ์กฐ. ๋ง์ง๋ง์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ค.",
"category": "์๋ฃ๊ตฌ์กฐ",
"difficulty": "๊ธฐ์ด",
"keywords": ["์คํ", "LIFO", "push", "pop"]
},
...
]
STEP 2 ยท Room DB ํ
์ด๋ธ ์ค๊ณ
ํ
์ด๋ธ | ์ฃผ์ ์ปฌ๋ผ | ์ญํ |
cs_concepts | id ยท title ยท description ยท category ยท difficulty | CS ๊ฐ๋
์๋ฌธ ์ ์ฅ |
user_progress | concept_id ยท is_learned ยท last_studied_at | ํ์ต ์ง๋ ์ถ์ |
bookmarks | concept_id ยท created_at | ์ฆ๊ฒจ์ฐพ๊ธฐ |
quiz_history | concept_id ยท is_correct ยท answered_at | ํด์ฆ ๊ธฐ๋ก |
STEP 3 ยท ์ฑ ์ฒซ ์คํ ์ DB ์ด์ ๋ก์ง
์ฑ์ ์ฒ์ ์ค์นํ๋ฉด ์๋์ผ๋ก JSON โ Room DB ๋ณํ์ด ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
์ฑ ์คํ
โ
Room DB๊ฐ ๋น์ด์๋๊ฐ? (์ฒซ ์ค์น ์ฌ๋ถ ํ์ธ)
โ YES
assets/cs_data.json ํ์ผ ์ฝ๊ธฐ
โ
JSON โ CsConceptEntity ๊ฐ์ฒด๋ก ๋ณํ
โ
Room DB์ ์ ์ฒด ์ฝ์
(insert)
โ
์ดํ ๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ทผ์ Room DB์์๋ง โ ์คํ๋ผ์ธ ์์ฑ
STEP 4 ยท ์ฝํ
์ธ ์
๋ฐ์ดํธ ์ด์ ๋ฐฉ์
์ํฉ | ์ฒ๋ฆฌ ๋ฐฉ๋ฒ | ์ฌ์ฉ์ ๊ฒฝํ |
์ CS ๊ฐ๋
์ถ๊ฐ | cs_data.json์ ์ถ๊ฐ โ ์ฑ ์ ๋ฒ์ ๋ฐฐํฌ | Play Store ์
๋ฐ์ดํธ ์๋ฆผ |
์คํ/์ค๋ฅ ์์ | JSON ์์ โ ์ฑ ์ ๋ฒ์ ๋ฐฐํฌ | ์
๋ฐ์ดํธ ํ ์๋ ๋ฐ์ |
์นดํ
๊ณ ๋ฆฌ ์ถ๊ฐ | JSON์ ์ ์นดํ
๊ณ ๋ฆฌ ํญ๋ชฉ ์ถ๊ฐ | ์
๋ฐ์ดํธ ํ ์ฆ์ ๋
ธ์ถ |
์ฌ์ฉ์ ์ง๋ ์ด๊ธฐํ | ์ค์ ํ๋ฉด์์ ์ง์ ์ด๊ธฐํ ๊ธฐ๋ฅ ์ ๊ณต | ๋ฐ์ดํฐ ์ ์ค ์์ด ์ ํ์ ์ด๊ธฐํ |
Freemium ๊ตฌ์กฐ (ํด๋ผ์ฐ๋ ์์ด ๊ตฌํ)
์๋ฒ ์์ด๋ Freemium์ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ตฌ๋
์ฌ๋ถ๋ฅผ ๊ธฐ๊ธฐ ๋ด๋ถ์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.
์ ์ ์ ํ | ์ ๊ทผ ๊ฐ๋ฅ ์ฝํ
์ธ | ์์ต |
๋ฌด๋ฃ ์ ์ | ์๋ฃ๊ตฌ์กฐ + ์๊ณ ๋ฆฌ์ฆ ์นดํ
๊ณ ๋ฆฌ (์ ์ฒด์ 40%) | ๊ด๊ณ ๋
ธ์ถ (AdMob) |
ํ๋ฆฌ๋ฏธ์ ์ ์ | ์ ์นดํ
๊ณ ๋ฆฌ + ๊ด๊ณ ์ ๊ฑฐ + ์คํ๋ผ์ธ ์ ์ฅ | ์ ๊ตฌ๋
๊ฒฐ์ |
โข
์๊ฐ ๊ตฌ๋
: 2,900์/์
โข
์ฐ๊ฐ ๊ตฌ๋
: 19,900์/๋
(์ฝ 43% ํ ์ธ)
โข
์ฒซ ๋ฌ ๋ฌด๋ฃ ์ฒดํ โ ์ ๋ฃ ์ ํ ์ ๋
โ Google Play Billing์ผ๋ก ๊ฒฐ์ ์ฒ๋ฆฌ (Kotlin ์ฝ๋ ๋ช ์ค๋ก ์ฐ๋ ๊ฐ๋ฅ)
Play Store ์ถ์ 7๋จ๊ณ
1.
play.google.com/console ์ ์ โ ๊ฐ๋ฐ์ ๋ฑ๋ก ($25 ์ผํ์ฑ)
2.
์ฑ ์๋ช
ํค์คํ ์ด ์์ฑ (Android Studio์์ Generate Signed Bundle)
3.
๋ด๋ถ ํ
์คํธ ๋ฒ์ ์
๋ก๋ โ ๋ณธ์ธ ๊ธฐ๊ธฐ์์ ์ต์ข
ํ์ธ
4.
์คํ ์ด ๋ฆฌ์คํ
์์ฑ: ์ฑ ์ด๋ฆ ยท ์ค๋ช
(ํ๊ตญ์ด) ยท ์คํฌ๋ฆฐ์ท 5์ฅ ยท ์์ด์ฝ
5.
๊ฐ์ธ์ ๋ณด์ฒ๋ฆฌ๋ฐฉ์นจ URL ๋ฑ๋ก (GitHub Pages ๋ฌด๋ฃ ํ์ฉ)
6.
์ฝํ
์ธ ๋ฑ๊ธ ์ค๋ฌธ ์๋ฃ
7.
์ ์ ์ถ์ ์ ์ถ โ ๊ฒํ 1~3์ผ โ ์คํ ์ด ๊ณต๊ฐ
์ฃผ์ฐจ | ์ด๋ฒ ์ฃผ ๋ชฉํ | ์๋ฃ |
0์ฃผ์ฐจ (์ง๊ธ) | play.kotlinlang.org ์ ์ ยท Kotlin Koans 1~10๋ฒ ํ๊ธฐ | โ |
1์ฃผ์ฐจ | Android Studio ์ค์น ยท Hello World ์คํ ยท ๊ธฐ๊ธฐ ์ฐ๊ฒฐ | โ |
2์ฃผ์ฐจ | Kotlin ๋ณ์ยท์กฐ๊ฑด๋ฌธยทํจ์ยท๋ ์์ ์ฑ ํ์ต | โ |
3์ฃผ์ฐจ | data class ยท List ยท filter ยท ๊ฐ๋จํ ๋ฐ์ดํฐ ๋ชจ๋ธ ์ง์ ์ค๊ณ | โ |
4์ฃผ์ฐจ | Coroutine ๊ธฐ์ด ยท ViewModel ๊ฐ๋
์ดํด | โ |
5์ฃผ์ฐจ | Compose ๊ธฐ์ด ยท ํ ํ๋ฉด ๋ ์ด์์ ํ๋กํ ํ์
์ ์ | โ |
6์ฃผ์ฐจ | CS ์นด๋ ํ์ต ํ๋ฉด ๊ตฌํ ยท Navigation ์ฐ๊ฒฐ | โ |
7์ฃผ์ฐจ | cs_data.json ์์ฑ ยท Room DB ์ค๊ณ ยท ์ฒซ ์คํ ์ด์ ๋ก์ง | โ |
8์ฃผ์ฐจ | ํด์ฆ ํ๋ฉด ยท ์ฆ๊ฒจ์ฐพ๊ธฐ ยท ํ์ต ์ง๋ ์ ์ฅ ๊ธฐ๋ฅ | โ |
9์ฃผ์ฐจ | Freemium ์ ๊ธ ๋ก์ง ยท Google Play Billing ์ฐ๋ | โ |
10์ฃผ์ฐจ | UI ๋ค๋ฌ๊ธฐ ยท ๋ฒ๊ทธ ์์ ยท ๋ฒ ํ ์ถ์ | โ |
11์ฃผ์ฐจ | ํผ๋๋ฐฑ ๋ฐ์ ยท ์คํ ์ด ๋ฆฌ์คํ
์์ฑ ยท ์ ์ ์ถ์ | โ |
โ play.kotlinlang.org ์ ์ โ ์ผ์ชฝ ์์ ์ง์ฐ๊ณ val name = '๋ด ์ด๋ฆ' ํ์ดํํด๋ณด๊ธฐ
โก developer.android.com/studio ๋ถ๋งํฌ ํด๋๊ธฐ
โข ๊ณต๋ถํ๊ณ ์ถ์ CS ์นดํ
๊ณ ๋ฆฌ 5๊ฐ ์ ์ด๋ณด๊ธฐ (์๋ฃ๊ตฌ์กฐ? OS? ๋คํธ์ํฌ?)
โฃ ์ด ๋ฌธ์ 1์ฃผ์ฐจ ์ฒดํฌ๋ฐ์ค ์๋ฃ ๋ชฉํ์ผ ์ ๊ธฐ
Kotlin ๋ชฐ๋ผ๋ ๊ด์ฐฎ์์. ์์๋๋ก๋ง ํ๋ฉด ์ฑ์ด ๋์ต๋๋ค. 

