๐ Idiom Quiz: ์ค๋งํธํฐ ์ ๋๋ง์ ์๋น (The Calm Ink)
โ์ด๋ฅด์ ๋ค์ ๋๋ ๊ฑด๊ฐ์ ์ํ, ๊ฐ์ฅ ๊ณ ์ํ๊ณ ์ฐ์ํ ์ฌ์์ฑ์ด ํ์ต ์ฑโ
๋ณธ ํ๋ก์ ํธ๋ 40๋ ์ด์ ์ฌ์ฉ์๋ฅผ ํ๊ฒ์ผ๋ก ํ Extreme Minimalism ๋์์ธ ์ฒ ํ ๊ธฐ๋ฐ์ ํด์ฆ ์ ํ๋ฆฌ์ผ์ด์
์
๋๋ค. Compose Multiplatform (CMP)์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ํ๋์ ์ธ ์๋๋ก์ด๋ ๋ฐ ๋ฉํฐํ๋ซํผ ๊ธฐ์ ์คํ์ ์ ์๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
๐ ๏ธ ๊ธฐ์ ์คํ ์์ธ ๋ช
์ธ (Full Technical Stack)
1. ํต์ฌ ์ธ์ด ๋ฐ ํ๋ ์์ํฌ (Core Stack)
- Kotlin 2.0.21: Kotlin K2 ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ ์๋์ ๋ฐํ์ ์ฑ๋ฅ์ ๊ทน๋ํํ์ต๋๋ค.
- Compose Multiplatform (CMP) 1.7.3: ์ ์ธํ UI ํ๋ ์์ํฌ๋ฅผ ํตํด Android์ ์ฐจํ ํ์ฅ๋ iOS ํ๋ซํผ ๊ฐ์ UI ๋ก์ง 100% ๊ณต์ ๋ฅผ ์คํํ์ต๋๋ค.
- Jetpack Compose Compiler: Kotlin 2.0.21 ๋ด์ฅ Compose ์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ์ ํตํ ๊ฐ๋ ฅํ ์ํ ๊ด๋ฆฌ์ UI ์ต์ ํ๋ฅผ ์ ์ฉํ์ต๋๋ค.
2. ์ํคํ
์ฒ ๋ฐ ์ํ ๊ด๋ฆฌ (Architecture)
- MVI (Model-View-Intent): ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(UDF) ์ํคํ
์ฒ๋ฅผ ์ฑํํ์ฌ ๋ณต์กํ ํด์ฆ ์ํ๋ฅผ ์์ธก ๊ฐ๋ฅํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค.
- Koin 4.0.0 (Dependency Injection):
koin-compose, koin-compose-viewmodel: CMP ํ๊ฒฝ์ ์ต์ ํ๋ ๊ฒฝ๋ ์์กด์ฑ ์ฃผ์
๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ท์ต๋๋ค.
- Coroutines 1.9.0 & Flow: ๋น๋๊ธฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ํตํด ๋งค๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- Kotlinx Serialization 1.7.3: JSON ๋ฐ์ดํฐ(idioms.json)๋ฅผ ๊ณ ์์ผ๋ก ํ์ฑํ๊ณ ํ์
์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
3. ๋ฐ์ดํฐ ๋ฐ ์์์ฑ (Data Storage)
- Realm Kotlin 3.0.0: KMP ๋ค์ดํฐ๋ธ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์์ฑ์ด ๋ฐ ํ์ต ๊ธฐ๋ก์ ๊ด๋ฆฌํฉ๋๋ค. ํ์ฌ ์คํค๋ง ๋ฒ์ 2 (
IdiomEntity, DailyRecordEntity).
- DataStore Preferences 1.1.1: ์ ์ ์ ์ค์ ๊ฐ(์๋ฆผ ์ค์ , ๋๊ธฐํ ๋ฒ์ ๋ฑ)์ ์์ ํ๊ฒ ์ ์ฅํฉ๋๋ค.
- Repository Pattern:
AssetIdiomDataSource์ Realm DB๋ฅผ ๊ฒฐํฉํ์ฌ ๋จ์ผ ๋ฐ์ดํฐ ์์ค ์์น(Single Source of Truth)์ ์ค์ํฉ๋๋ค.
4. ์๊ฐ ๋ฐ ์ ๋๋ฉ์ด์
(UI/UX)
- Material 3 (M3): ์ต์ ๋์์ธ ๊ฐ์ด๋๋ฅผ ์ค์ํ๋ฉด์๋ โThe Calm Inkโ๋ง์ ๋ฏธ๋๋ฉ๋ฆฌ์ฆ์ ๊ตฌํํ์ต๋๋ค.
- Compottie 2.0.0-rc02 (Lottie for CMP):
success.lottie, wrong.lottie: ๋จน๋ฌผ ๋ฒ์ง ํจ๊ณผ์ ๊ฐ์ ๋์์ ์ ๋๋ฉ์ด์
์ ๊ณ ํด์๋ ๋ฒกํฐ๋ก ๊ตฌํํ์ต๋๋ค.
- Jetpack Compose Navigation (CMP Compatible): Type-safe Navigation์ ํตํด ํ๋ฉด ๊ฐ ์ด๋์ ์์ ์ฑ์ ํ๋ณดํ์ต๋๋ค.
5. ์ธํ๋ผ ๋ฐ ๋ถ์ (Infra & Analytics)
- Firebase 33.9.0 (BOM):
- Analytics: ์ฌ์ฉ์ ํ์ต ํจํด ๋ฐ ์ฒด๋ฅ ์๊ฐ ๋ถ์.
- Crashlytics: ์ค์๊ฐ ์ฑ ์ค๋ฅ ํธ๋ํน ๋ฐ ์์ ์ฑ ํ๋ณด.
- Google AdMob 23.6.0: ๋ณด์ํ ๊ด๊ณ (Rewarded Ads) ์์คํ
์ ์ํ ๊ธฐ๋ฐ ์ค๊ณ๋ฅผ ์๋ฃํ์ต๋๋ค.
- WorkManager 2.10.0: ์ ์ ์ ์ฌ๋ฐฉ๋ฌธ์ ์ ๋ํ๋ ์ง๋ฅ์ ๋ก์ปฌ ์๋ฆผ(Reminder) ์์คํ
์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ์ดํฉ๋๋ค.
6. ๋น๋ ์์คํ
(Build & Gradle)
- Gradle 8.10.2+: ์ต์ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Version Catalogs (
libs.versions.toml): ๋ชจ๋ ์์กด์ฑ์ ์ค์ ๊ด๋ฆฌํ์ฌ ๋ฒ์ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ ์ง๋ณด์์ฑ์ ๊ทน๋ํํ์ต๋๋ค.
- KSP (Kotlin Symbol Processing): Room DB ๋ฐ ์ปดํ์ผ ํ์ ์ต์ ํ๋ฅผ ์ํด ์ต์ KSP๋ฅผ ํ์ฉํฉ๋๋ค.
๐ง ํต์ฌ ๋น์ฆ๋์ค ์๊ณ ๋ฆฌ์ฆ
๐ Smart Revisit Algorithm (์ง๋ฅ์ ๋ณต์ต)
- ๋จ์ ๋ฌด์์ ์ถ์ถ์ด ์๋,
exposureCount(๋
ธ์ถ ๋น๋)์ correctCount(์ ๋ต ํ์)๋ฅผ ์ค์๊ฐ ๋ถ์ํ์ฌ ์ ์ ๊ฐ ์๋ฒฝํ๊ฒ ์๊ธฐํ ๋๊น์ง ์ง๋ฅ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ถ์ ํฉ๋๋ค.
๐ 6์ข
ํผํฉ ํด์ฆ (Mixed Quiz Types)
- ๊ฐ๊ด์ 3์ข
: ๋น์นธ 1๊ธ์(FILL_BLANK), ๋ปโํ์(MEANING_TO_WORD), ํ์โํ๊ธ(HANJA_TO_HANGUL)
- ์ฃผ๊ด์ 2์ข
: ๋น์นธ 2์นธ(FILL_BLANKS_2), ๋น์นธ 4์นธ(FILL_BLANKS_4)
- ์์ ๋งํ๊ธฐ: ์ฑ์ด ๊ธ์ ์์ ๋ฐฐ์ด(ORDER_MATCH) โ 12๊ฐ ๊ธ์ ํ์์ 4๊ธ์ ์ ํ
๐ฅ ์ฝค๋ณด & ๋ณด์ ์์คํ
- 2๊ฐ ์ด์ ์ฐ์ ์ ๋ต ์ ์ฝค๋ณด ํ์ฑํ, ์ต๋ +5 XP ๋ณด๋์ค (6์ฐ์ ์ด์ ์ ์บก).
- ์ฝค๋ณด ๋ฐ์ ์ ์ ์ฉ ์ ๋๋ฉ์ด์
๋ฐ ๋ณด๋์ค XP ํ์.
- ์ค๋ต ์ ์ฝค๋ณด ์นด์ดํธ ์ฆ์ ์ด๊ธฐํ.
๐ ํ๋กํ ํ์ต ๋ถ์
- ์ฃผ๊ฐ ํ์ต ํต๊ณ ์ฐจํธ: Canvas ๊ธฐ๋ฐ ๋ง๋ ์ฐจํธ๋ก ์ฃผ๊ฐ ํ์ด ์, ์ ๋ต๋ฅ , ํ๋์ผ ์๊ฐํ.
- ์๊ฐ ํ์ต ์บ๋ฆฐ๋: ์คํธ๋ฆญ ํํธ๋งต์ผ๋ก ์๋ณ ํ์ต ํ๋ ํ๋์ ํ์
. ์ ์ด๋ ๋ค๋น๊ฒ์ด์
์ง์.
๐ ์๊ณ ์์ธ ๋ทฐ
- ์์งํ ์ฑ์ด ํฐ์น ์ ๋ฐํ
์ํธ๋ก ํ์, ๋
์, ๋ปํ์ด, ๋์ด๋ ๋ณ์ , ๋ค์ด๋ฒ ์ฌ์ ์ธ๋ถ ๋งํฌ ์ ๊ณต.
Last Updated: 2026-06-03
Architected & Documented by PM Mark