Skip to content

Repository files navigation

📱 Android Architecture Lab (Skill Step Labs Series #09)

안드로이드 클린 아키텍처(Clean Architecture), Jetpack Compose & MVI 모바일 모듈화 실습 랩
🔗 GitHub Topics: #mobile-native #android #kotlin #clean-architecture #mvi #jetpack-compose #hilt


📌 1. 프로젝트 개요 (Overview)

본 레포지거리는 안드로이드 모바일 개발에서 화면 회전 시 UI 상태 유실, 비동기 코루틴 스레드 메모리 누수, 모놀리식 Activity/Fragment의 거대화(Massive Controller) 문제를 극복하고 클린 아키텍처 3계층(UI - Domain - Data) 분리로 확장성과 테스트 가능성을 확보합니다.


🛠️ 2. 기술 스택 (Tech Stack)

구 분 기술 스택 / 라이브러리 주요 용도
Language & UI Kotlin 2.0+, Jetpack Compose 선언적 모바일 UI 렌더링 및 상태 바인딩
Architecture Clean Architecture, MVI / MVVM, UDF 3계층 분리 및 단방향 데이터 흐름(Unidirectional Data Flow)
Async & State Kotlin Coroutines, StateFlow, SharedFlow 비동기 스레드 디스패칭 및 핫/콜드 스트림
DI & Persistence Hilt / Dagger, Room DB, Retrofit2 의존성 주입 및 오프라인 First 캐싱

💡 3. 핵심 학습 모듈 (Key Learning Modules)

1) Clean Architecture 3계층 분리 (src/main/java)

  • 위치: src/main/java/com/dayainow/lab
  • 핵심:
    • presentation: Compose UI & ViewModel (UI State)
    • domain: UseCases & Domain Entities (순수 코틀린 Business Logic)
    • data: Repository Implementations & Room / Retrofit Data Sources

2) MVI (Model-View-Intent) & StateFlow

  • 위치: presentation/mvi
  • 핵심: UserIntentViewModelReducerUiState 단방향 불변 상태(StateFlow) 갱신 및 SharedFlow 일회성 이벤트를 통한 화면 전환.

3) Coroutines Dispatchers & Hilt DI

  • 위치: di/AppModule.kt
  • 핵심: Dispatchers.IO 비동기 네트워크/DB 처리와 Dispatchers.Main UI 스레드 전환 및 @HiltViewModel 주입.

🎯 4. 핵심 엔지니어링 & 트레이드오프 딥다이브 (Core Engineering Deep-Dive)

Q1. MVVM 대비 MVI 패턴 도입 시 얻는 상태 예측 가능성과 장점은?

분석: MVVM은 개별 LiveData/StateFlow 상태가 파편화되어 갱신 시 경합 조건(Race Condition)이 발생할 위험이 있습니다. MVI는 유저의 행동을 Intent로 일원화하고 전체 UI 상태를 단 하나의 불변 UiState 데이터 클래스로 관리하여 높은 예측 가능성과 단방향 흐름(UDF)을 보장합니다.

Q2. Kotlin Flow의 Cold Stream 대 Hot Stream (StateFlow / SharedFlow) 메커니즘 차이는?

분석: **Cold Stream(Flow)**은 수집가(collect)가 구독하는 시점에 데이터를 발행하는 일대일 스트림입니다. **Hot Stream(StateFlow / SharedFlow)**은 수집 여부와 상관없이 메모리에서 값을 유지하며 다수의 수집가에게 브로드캐스트합니다. StateFlow는 최신 상태값 1개를 보관하고, SharedFlow는 Toast나 화면 이동 같은 일회성 이벤트(Single Event) 발행에 사용됩니다.

Q3. 안드로이드 생명주기 관리를 위한 `repeatOnLifecycle` 유틸리티의 메모리 누수 방지 원리는?

분석: 단순히 lifecycleScope.launch에서 Flow를 수집하면 앱이 백그라운드(STOPPED)로 전환되어도 계속 데이터를 수집하여 메모리 누수와 리소스 낭비가 발생합니다. repeatOnLifecycle(Lifecycle.State.STARTED)를 결합하면 UI가 표시될 때만 수집하고 백그라운드 시 동적으로 멈춰 안전합니다.


🏃 5. 로컬 빌드 & 실행 방법 (How to Run)

# 1. Android Gradle 빌드
./gradlew build

# 2. 유닛 테스트 실행
./gradlew test

🗺️ 6. Skill Step Labs 성격별 카테고리 로드맵

🎨 1. Frontend & Mobile Web Architecture (#frontend-architecture)

⚡ 2. Fullstack & Backend Performance (#backend-performance)

🐳 3. Infrastructure & DevOps (#infra-devops)

🧠 4. AI Engineering & Data Platform (#ai-data-platform)

📱 5. Mobile Native Architecture (#mobile-native)

Releases

Packages

Contributors

Languages