๊ตญ๋ฆฝํ๊ตญ๊ตํต๋ํ๊ต ๊ณต์ง์ฌํญ ์๋ฆฌ๋ฏธ ์๋น์ค
Role:ย ์๋๋ก์ด๋ ๊ฐ๋ฐ (Android Native)
Status:ย ์ด์ ์ค (Play Store ๋ฐฐํฌ)
Users:ย ์ด ์ฌ์ฉ์ 250๋ช + / ์๊ฐ ํ์ฑ ์ฌ์ฉ์(MAU) 130๋ช +
"์ฐ๋ฆฌ ํ๊ต ๊ณต์ง์ฌํญ, ์ด์ ๋์น์ง ๋ง์ธ์."
KNUTICE๋ ํ๊ต ํํ์ด์ง์ ์ ๊ณต์ง์ฌํญ์ด ์ฌ๋ผ์ค๋ฉด, ํธ์ ์๋ฆผ์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์๋ ค์ฃผ๋ ์๋น์ค์์.
ํ์ฐ๋ค์ด ๋งค๋ฒ ํ๊ต ํํ์ด์ง์ ์ ์ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ์์ ๊ณ , ์ฅํ๊ธ์ด๋ ํ์ฌ ์ผ์ ๊ฐ์ ์ค์ํ ์ ๋ณด๋ฅผ ๋์น์ง ์๋๋ก ๋๊ธฐ ์ํด ๋ง๋ค์์ด์.
์์ ์ ์ธ ์๋น์ค ์ด์๊ณผ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ์ต์ ์๋๋ก์ด๋ ๊ธฐ์ ์คํ์ ์ ์ฉํ์ด์.
-
Language:ย
Kotlin -
UI:ย
Jetpack Composeย (Material3),ยNavigation for Compose -
Architecture:ย
Multi-Module Clean Architecture,ยMVI (Unidirectional Data Flow) -
Async & Stream:ย
Coroutines,ยFlow (StateFlow, SharedFlow) -
DI:ย
Dagger 2 -
Local DB:ย
Roomย (FTS4, Custom Tokenizer applied),ยDataStore -
Background Task:ย
WorkManagerย (PeriodicWork, Chained Task) -
Network:ย
Retrofit2,ยOkHttp -
CI:ย
GitHub Actions
๋จ์ํ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด, ์ฑ์ด ์ปค์ ธ๋ ์ ์ง๋ณด์๊ฐ ์ฝ๋๋กย Multi-Module Clean Architecture๋ฅผ ๋์ ํ์ด์.
-
Multi-Module Strategy:ย
app,ยcore,ยfeature,ยdomain,ยdataย ๋ฑ ์ญํ ๋ณ๋ก ๋ชจ๋์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ๋น๋ ํจ์จ์ ๋์์ด์. -
MVI Pattern:ย
State,ยEvent,ยSideEffect๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ๋ฐ์ดํฐ ํ๋ฆ์ ๋จ๋ฐฉํฅ์ผ๋ก ๊ด๋ฆฌํจ์ผ๋ก์จ, UI ์ํ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋์ด๊ณ ๋๋ฒ๊น ์ ์ฝ๊ฒ ๋ง๋ค์์ด์.
graph TD
%% --- Styling Definitions ---
%% Green for Domain (The Heart)
classDef domain fill:#d4edda,stroke:#155724,stroke-width:2px,color:#155724;
%% Blue for Features
classDef feature fill:#cce5ff,stroke:#004085,stroke-width:2px,color:#004085;
%% Orange for Data/Network
classDef data fill:#fff3cd,stroke:#856404,stroke-width:2px,color:#856404;
%% Grey for Shared/Infrastructure (Low visual impact)
classDef shared fill:#f8f9fa,stroke:#6c757d,stroke-width:1px,stroke-dasharray: 5 5,color:#6c757d;
%% Standard App Root
classDef app fill:#e9ecef,stroke:#343a40,stroke-width:2px,color:#343a40;
%% --- Nodes ---
App(":app"):::app
subgraph Presentation ["Presentation Layer"]
FeatMain(":feature:main"):::feature
FeatBookmark(":feature:bookmark"):::feature
end
subgraph Business ["Domain Layer"]
%% The core is isolated
Domain(":core:domain"):::domain
end
subgraph DataInfra ["Data & Infrastructure"]
Data(":core:data"):::data
Network(":core:network"):::data
Notif(":core:notification"):::data
end
subgraph SharedKernel ["Shared Modules (Ubiquitous)"]
%% Placed at bottom to catch all downward arrows neatly
Common(":common"):::shared
Model(":core:model"):::shared
end
%% --- Critical Architecture Flows (Thick Lines) ---
%% These show the logic flow
FeatMain ==> Domain
FeatBookmark ==> Domain
Data ==> Domain
%% --- Structural Wiring (Standard Lines) ---
App --> FeatMain
App --> FeatBookmark
App --> Data
App --> Network
App --> Notif
%% Data internal wiring
Data --> Network
%% --- Shared Dependencies (Dotted/Subtle Lines) ---
%% Using dotted lines prevents the 'Messy Web' effect
FeatMain -.-> Common & Model
FeatBookmark -.-> Common & Model
Domain -.-> Model
Data -.-> Common & Model
Network -.-> Common & Model
Notif -.-> Common & Model
%% Specific Cross-Module Dependencies
FeatBookmark -.-> Notif
์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์ด์ํ๋ฉด์ ๋ง์ฃผ์น ๊ธฐ์ ์ ๋ฌธ์ ๋ค๊ณผ, ์ด๋ฅผ ํด๊ฒฐํ ๊ณผ์ ์ ์ ๋ฆฌํ์ด์.
์ฌ์ฉ์๊ฐ ์ ์ฅํ ๊ณต์ง์ฌํญ(๋ถ๋งํฌ)์ ๊ฒ์ํ ๋, ๋จ์ SQLย LIKEย ์ฟผ๋ฆฌ๋ ์ ํ๋๊ฐ ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ์์์ด์. ์๋ฅผ ๋ค์ด '๊ณต์ง'๋ฅผ ๊ฒ์ํ๋ฉด ์๋์ ๋ค๋ฅธ '์ธ๊ณต์ง๋ฅ'๊น์ง ๊ฒ์ ๊ฒฐ๊ณผ์ ํฌํจ๋๊ณค ํ์ด์.
-
Room FTS4(Full-Text Search)ย ํ ์ด๋ธ์ ๋์ ํ์ฌ ํ ์คํธ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ฐํํ์ด์.
-
ํ๊ธ ํํ์ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(
OpenKoreanTextProcessor)๋ฅผ ํ์ฉํด ๊ฒ์์ด์ ํ ํฐ์ ๋ถ๋ฆฌํ๊ณ , ์ด๋ฅผ FTS ์ฟผ๋ฆฌ์ ์ ์ฉํจ์ผ๋ก์จย '์ธ๊ณต์ง๋ฅ' ๋ฑ ๋ถํ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ธํ๊ณ ์ ํํ '๊ณต์ง'์ ๊ด๋ จ๋ ํญ๋ชฉ๋ง ํํฐ๋งํ๋๋ก ๊ฐ์ ํ์ด์.
์๋ฒ์ AI๊ฐ ์์ฑํ ๋งํฌ๋ค์ด ์๋ต์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ ๋๋งํ ๊ฒฝ์ฐ, ์ฑ์ ๋์์ธ ํ ๋ง์ ์ด์ง๊ฐ์ด ์๊ธฐ๋ ๋ฌธ์ ๊ฐ ์์์ด์.
-
Native Component Mapping:ย ๋จ์ํ ํ ์คํธ ๋ณํ์ ๋์ด, ๋งํฌ๋ค์ด์ ๊ตฌ์กฐ์ ์์(Heading, Table, Divider, List ๋ฑ)๋ฅผ ๊ฐ๊ฐ์ย ๋ ๋ฆฝ๋ Native Composable๋ก ์ง์ ๊ตฌํํ์ฌ ๋งคํํ์ด์. ์ด๋ฅผ ํตํด ๋ชจ๋ UI ์์๊ฐ ์ฑ์ ํ ๋ง(Material Theme)์ 100% ์ผ์นํ๋๋ก ๋ง๋ค์์ด์.
-
Recursive Text Parsing:ย ํ ์คํธ ๋ด๋ถ์ย
_**Bold & Italic**_๊ณผ ๊ฐ์ ๋ณตํฉ ๋ฌธ๋ฒ(Compound Syntax)์ย DFS ๊ธฐ๋ฐ์ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ฑํ์ฌยAnnotatedString์ผ๋ก ๋ณํํจ์ผ๋ก์จ, ์ค์ฒฉ๋ ์คํ์ผ๋ ๊นจ์ง ์์ด ์ ํํ๊ฒ ๋ ๋๋งํ์ด์.
FTS ํ
์ด๋ธ์ ์ธ๋ฑ์ฑ ๊ณผ์ ๋๋ฌธ์ ์ฐ๊ธฐ(Insert) ์๋๊ฐ ๋๋ฆฐ ํธ์ด์์.ย Dispatchers.IO๋ก ์์
์ ๋ถ๋ฆฌํ์์๋, ๋ถ๋งํฌ ์ ์ฅ ์ ์์
์๊ฐ์ด ๊ธธ์ด์ ธย CircularProgressIndicator(๋ก๋ฉ ํ๋ฉด)๊ฐ ๋๋ฌด ์ค๋ ์ง์๋๋ UX ๋ฌธ์ ๊ฐ ์์์ด์.
-
Staging Table ์ ๋ต:ย ๋ถ๋งํฌ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฆ์ ์ธ๋ฑ์ฑ ๋น์ฉ์ด ์๋ ๊ฐ๋ฒผ์ดย
Staging Table์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ, ๋ก๋ฉ ์ํ๋ฅผ ๋ฐ๋ก ์ข ๋ฃํ๊ณ ์พ์ ํ UX๋ฅผ ์ ๊ณตํ์ด์. -
Deferred Indexing:ย ์ดํย WorkManager๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ Staging ๋ ๋ฐ์ดํฐ๋ฅผ FTS ํ ์ด๋ธ๋ก ์์ ํ๊ฒ ์ด๊ด(Migration)ํ๋๋ก ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ฌ, ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ชจ๋ ์ก์์ด์.
์ฑ์ด ์ค๋ซ๋์ ์คํ๋์ง ์๊ฑฐ๋ ๊ธฐ๊ธฐ๊ฐ ์ ์ ๋ชจ๋์ ๋ค์ด๊ฐ๋ฉด FCM ํ ํฐ์ด ๋ง๋ฃ๋๊ฑฐ๋ ๋๊ธฐํ๋์ง ์์ ์๋ฆผ์ ๋์น ์ํ์ด ์์์ด์.
- WorkManager์ PeriodicWork๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ๊ธฐ์ ์ผ๋ก FCM ํ ํฐ์ ์๋ฒ์ ๋๊ธฐํํ๊ณ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ ๋ก์ง์ ๊ตฌํํ์ด์. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์ฑ์ ์์ฃผ ์ผ์ง ์์๋ ์ค์ํ ๊ณต์ง ์๋ฆผ์ ์์ ์ ์ผ๋ก ๋ฐ์ ์ ์๋๋ก ํ์ด์.
์ด ํ๋ก์ ํธ๋ฅผ ํตํด ์๋๋ก์ด๋ ํ๋ ์์ํฌ์ ๊น์ด ์๋ ํ์ฉ๋ฒ๊ณผ ์ํคํ ์ฒ์ ์ค์์ฑ์ ๋ฐฐ์ ์ด์.
-
Clean Architecture & Multi-Module:ย ์ฑ๊ธ ๋ชจ๋์์ ํจํค์ง๋ก๋ง ๊ตฌ๋ถํ ๋์ ๋ฌ๋ฆฌ, ์ค์ ๋ชจ๋์ ๋ถ๋ฆฌํ๋ฉฐ ์์กด์ฑ ๊ท์น์ ๊ฐ์ ํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ๋น๋ ์๋์ ์ด๋ค ์ด์ ์ ์ฃผ๋์ง ์ฒด๊ฐํ์ด์.
-
Compose & Lifecycle:ย Jetpack Compose๋ก UI๋ฅผ ์ค๊ณํ๋ฉฐ, ๊ธฐ์กด ๋ช ๋ นํ UI(XML)์ ๋ค๋ฅธ ์ ์ธํ UI์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ๋ฒ๊ณผ ํจ์จ์ ์ธ ์ฌ์ฌ์ฉ(Composable) ๊ตฌ์กฐ๋ฅผ ์ตํ์ด์.
-
Efficient Data Pipeline (Flow):ย
StateFlow๋ก UI ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ,ยSharedFlow์ยChannel์ ์ด์ฉํด ๋จ๋ฐ์ฑ ์ด๋ฒคํธ(Side Effect)๋ฅผ ์ฒ๋ฆฌํด์ ๊ฒฌ๊ณ ํ MVI ์ํ๊ด๋ฆฌ๋ฅผ ๊ตฌํํด ๋ณผ ์ ์์์ด์.ยsnapshotFlow๋ฅผ ํ์ฉํด ์ฌ์ฉ์ ์ ๋ ฅ์ ์ค์๊ฐ์ผ๋ก ๊ฐ์งํ๊ณ ,ยdebounce์ยdistinctUntilChangedย ์ฐ์ฐ์๋ฅผ ์ ์ฉํด ๋ณ๋์ ๊ฒ์ ๋ฒํผ ์์ด๋ ๊ณผ๋ํ ๋คํธ์ํฌ ์์ฒญ์ ๋ฐฉ์งํ๋ ์ต์ ํ๋ ๊ฒ์ ๋ก์ง์ ์ค๊ณํ์ด์. ๋ํ,ยRemote/DB์์ยDomain์ ๊ฑฐ์ณยViewModel๋ก ์ด์ด์ง๋ ๋ฐ์ดํฐ ๊ณ์ธต์ยCold Flow๋ก ์ฐ๊ฒฐํ์ฌ ๋๊น ์๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ(UDF)์ ์์ฑํ์ด์. -
Deep Dive into Dagger 2 (Migration from Hilt):ย ์ด๊ธฐ์๋ Dagger Hilt๋ฅผ ์ฌ์ฉํ์ผ๋, ๋ฉํฐ ๋ชจ๋ ์ ํ ๊ณผ์ ์์ ํ๋ ์์ํฌ์ ๋์ ์๋ฆฌ๋ฅผ ๋ ๊น์ด ์ดํดํ๊ณ ์ Pure Dagger 2๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ๋จํํ์ด์. ์ด ๊ณผ์ ์ ์ฝ์ง ์์์ง๋ง,ย
Component์ยSubComponent์ ๊ณ์ธต ๊ตฌ์กฐ,ยScopeย ๊ด๋ฆฌ,ยBuilder/Factoryย ํจํด ๋ฑ์ ์ง์ ๊ตฌํํด๋ณด๋ฉฐ Hilt์ ํธ๋ฆฌํจ ๋ค์ ์จ๊ฒจ์ง ์์กด์ฑ ์ฃผ์ ์ ์ ์์ ์ธ ๋งค์ปค๋์ฆ์ ๋ชธ์ ์ตํ ์ ์์์ด์. -
Modern Navigation:ย Single Activity ๊ตฌ์กฐ์์ย
Navigation for Compose๋ฅผ ํ์ฉํด ํ๋ฉด ๊ฐ ์ ํ๊ณผ ๋ฐ์ดํฐ ์ ๋ฌ(Argument passing)์ ๋งค๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ตํ์ด์.







