Jetpack Compose와 MVI 아키텍처: 단방향 데이터 흐름으로 견고한 안드로이드 앱 만들기

1. MVI 패턴의 핵심: Unidirectional Data Flow (UDF)

MVI는 데이터가 오직 한 방향으로만 흐르는 것을 강제합니다. 사용자의 액션(Intent)이 상태(Model)를 변화시키고, 변화된 상태가 다시 화면(View)에 반영되는 순환 구조입니다. 이 단순함이 복잡한 UI 상태를 예측 가능하게 만듭니다.

MVI Loop in Jetpack Compose
Intent -> Model(State) -> View로 이어지는 단방향 데이터 흐름

Pro-tip: Compose에서는 `StateFlow`나 `SharedFlow`를 활용하여 ViewModel의 상태를 UI에 노출하십시오. `collectAsStateWithLifecycle()`을 사용하면 생명주기 안정성까지 확보할 수 있습니다.

2. Side-Effect 관리: 효과적인 비동기 처리 전략

UI를 그리는 것 외의 모든 것(네트워크 요청, 데이터베이스 쓰기, 토스트 메시지 등)은 Side-Effect입니다. Compose는 `LaunchedEffect`, `SideEffect`, `DisposableEffect` 등 다양한 API를 제공하여 이러한 효과들을 렌더링 주기와 안전하게 연동할 수 있게 해줍니다.

Jetpack Compose Side Effects Management
컴포저블 생명주기 내에서의 안전한 비동기 작업 및 클린업

The ‘Bad’ Way: Ad-hoc State Mutation (Chaos)

// 여러 곳에서 상태를 직접 수정 (디버깅의 지옥 시작)
var state by mutableStateOf(MyState())

fun onButtonClick() {
    state = state.copy(isLoading = true)
    fetchData()
}

The ‘ELITE’ Way: Structured Intent Processing

// 모든 액션을 Intent(Action)로 정의하여 ViewModel에서 중앙 관리
sealed class MainIntent {
    object LoadData : MainIntent()
    data class UpdateValue(val text: String) : MainIntent()
}

// ViewModel 내부
fun dispatch(intent: MainIntent) {
    when(intent) {
        is MainIntent.LoadData -> { /* ... */ }
    }
}

3. Smart Recomposition과 성능 최적화

Compose의 마법은 ‘스마트 재구축’에 있습니다. 바뀐 부분만 다시 그리는 것이죠. 하지만 우리가 `Stable`하지 않은 객체를 파라미터로 넘기면 Compose는 안전을 위해 전체 부모 노드를 다시 그리게 됩니다. `@Stable`, `@Immutable` 어노테이션을 적절히 사용하여 불필요한 연산을 줄이십시오.

Compose Smart Recomposition
안정적인 객체 관리를 통한 최소 단위의 UI 업데이트 프로세스

4. State Hoisting: 재사용 가능한 컴포저블의 비결

상태를 위로 끌어올리십시오(State Hoisting). 컴포저블이 스스로 상태를 가지지 않고 파라미터로 전달받게 만들면, 테스트하기 쉬워지고 다양한 상황에서 재사용할 수 있는 ‘Stateless’한 UI 컴포넌트가 탄생합니다.

Lesson Learned: 대량의 리스트를 다룰 때는 `DerivedStateOf`를 활용하여 연산 결과가 바뀔 때만 리컴포지션이 일어나도록 정교하게 제어하십시오. 이는 스크롤 성능에 직결됩니다.

5. 현대 안드로이드 개발자의 자세: 선언적으로 사고하라

명령적으로 ‘이 뷰를 숨겨라’라고 말하는 대신, ‘이 상태일 때 이 뷰는 보이지 않는다’라고 정의하십시오. 사고의 전환이 코드를 단순하게 만들고 유지보수 비용을 낮춥니다. Compose와 MVI의 조합은 그 정점에 있습니다.

결론: 더 나은 안드로이드 앱을 향하여

Jetpack Compose와 MVI는 단순히 유행하는 기술이 아니라, 안드로이드 앱의 복잡도를 관리하는 강력한 무기입니다. 오늘 다룬 원칙들을 실전 프로젝트에 적용하여, 장애에 강하고 확장이 용이한 ‘Elite’ 안드로이드 앱을 만들어 보시길 바랍니다.

댓글 남기기