- Preferred Language: Korean (한국어) - The agent must respond in Korean.
This is a modern Android application built with Kotlin, following Clean Architecture principles. It utilizes the latest Jetpack Compose for UI and the experimental Navigation 3 library for type-safe navigation.
The project is structured into three main layers (Clean Architecture):
- Presentation Layer (
presentation/): Contains UI components (Compose), Screens, and ViewModels. - Domain Layer (
domain/): Contains the business logic, UseCases, and Repository interfaces. This layer is purely Kotlin and framework-agnostic. - Data Layer (
data/): Contains the implementation of Repositories, Data Sources (API/DB), and Mappers.
- Language: Kotlin
- UI: Jetpack Compose (Material3)
- Dependency Injection: Koin
- Navigation: AndroidX Navigation 3 (Experimental/Alpha)
- Image Loading: Coil 3
- Concurrency: Kotlin Coroutines & Flow
- Build System: Gradle (Kotlin DSL) with Version Catalog (
libs.versions.toml)
app/src/main/java/com/survivalcoding/gangnam2kiandroidstudy/
├── core/ # Core utilities, DI modules, and Routing
│ ├── di/ # Koin modules (App, Network, Repo, etc.)
│ └── routing/ # Navigation 3 logic (NavigationRoot.kt, Route.kt)
├── data/ # Data layer implementation
├── domain/ # Domain layer interfaces and use cases
├── presentation/ # UI layer (Screens, Components)
├── ui/ # UI Theme, Colors, Fonts
├── AppApplication.kt # Application class (Koin init)
└── MainActivity.kt # Entry point
- JDK 11+
- Android Studio
-
Build Debug APK:
./gradlew assembleDebug
-
Run Unit Tests:
./gradlew test -
Run Instrumented Tests:
./gradlew connectedAndroidTest
-
Clean Build:
./gradlew clean build
- Navigation: All navigation logic is centralized in
core/routing/NavigationRoot.ktusingNavDisplayandentryProvider. Routes are defined incore/routing/Route.kt. - Dependency Injection: Modules are defined in
core/di/. Ensure new dependencies are added to the appropriate module and the module is added to thestartKoinblock inAppApplication.kt. - Composables: Screen-level composables usually have a
Rootsuffix (e.g.,HomeRoot,SavedRecipesRoot) handling state and events, calling into pure UI composables.