Android 앱을 향상시키세요: Jetpack Compose와 함께하는 아키텍처 패턴
발행: (2025년 12월 14일 오전 09:36 GMT+9)
4 min read
원문: Dev.to
Source: Dev.to
Android 아키텍처 패턴이란?
앱 Android 코드를 다음과 같이 조직하도록 권장되는 방식입니다:
- 더 유지보수하기 쉬움
- 더 확장 가능함
- 더 테스트하기 쉬움
- 팀이 이해하기 쉬움
Kotlin + Jetpack Compose와 함께 Google은 반응형·단방향 아키텍처를 권장합니다.
주요 역할
@Composable 함수
- 상태만 표시함
- 비즈니스 로직을 포함하지 않음
- 상태 변화에 반응함
@Composable
fun HomeScreen(state: HomeState) {
Text(text = state.title)
}
ViewModel
- UI 상태를 관리함
- 프레젠테이션 로직을 포함함
- 구성 변경을 견딤
StateFlow또는LiveData를 노출함
class HomeViewModel : ViewModel() {
private val _state = MutableStateFlow(HomeState())
val state = _state.asStateFlow()
}
비즈니스 규칙
- UseCase(사용 사례) – Android와 무관함
- Repository
- API (Retrofit)
- 데이터베이스 (Room)
Compose와 함께 권장되는 아키텍처
UI (Compose)
↓
ViewModel
↓
Repository
↓
Data Source (API / DB)
사용자 액션 흐름
@Composable
fun HomeScreen(viewModel: HomeViewModel = viewModel()) {
val state by viewModel.state.collectAsState()
Button(onClick = { viewModel.loadData() }) {
Text("Cargar")
}
}
이 접근 방식의 장점
- 책임이 명확히 분리됨
- 테스트가 쉬움
- Compose에 최적화됨
- 대규모 앱에서 매우 인기 있음
MVI 패턴 (Model‑View‑Intent)
- Intent: 사용자의 액션
- State: 화면 전체 상태
- Reducer: 상태를 변환함
Intent → ViewModel → Reducer → New State → UI
sealed class HomeIntent {
object LoadData : HomeIntent()
}
data class HomeState(val loading: Boolean = false)
장점
- 불변 상태
- 예측 가능한 흐름
- 복잡한 UI에 최적화됨
단점
- 코드와 복잡성이 증가함
- UI 패턴을 넘어 전체 아키텍처임
계층형 구조
- Presentation: Compose + ViewModel
- Domain: UseCases
- Data: Repository, API, DB
특징
- 내부 계층이 외부 계층에 의존하지 않음.
- UI는 데이터 세부 정보를 알지 못함.
장점
- 확장성 좋음
- 테스트 용이함
- 대규모 프로젝트에 최적화됨
MVVM + 단방향 데이터 흐름 + StateFlow + Jetpack Compose
- ViewModel이 유일한 상태 소스 역할을 함
- Compose는 상태를 관찰하고 렌더링만 함
- 상태는 불변임
- 이벤트는 상태와 분리됨
Event → ViewModel → State → Compose UI
버그를 방지하고 UI를 예측 가능하게 만들어요.
프로젝트 유형별 권장 사항
| 앱 유형 | 권장 아키텍처 |
|---|---|
| 작은 앱 | MVVM |
| 중간 규모 앱 | MVVM + Clean |
| 큰 앱 | MVI + Clean |
| 복잡한 UI | MVI |
결론
- Jetpack Compose는 UI에 대한 사고 방식을 바꿉니다.
- MVVM은 여전히 기본입니다.
- 상태가 앱의 핵심입니다.
- 단방향 흐름은 오류를 줄여줍니다.