피드로 돌아가기
올리브영 테크블로그Mobile
원문 읽기
Android Kotlin StateFlow 도입기
Android 팀이 LiveData 대신 StateFlow를 도입해 클린아키텍처의 Domain Layer에서 안드로이드 플랫폼 의존성 제거
AI 요약
Context
LiveData는 Android 플랫폼에 종속적이어서 UI가 없는 Domain Layer에서 사용하기 어렵다. 클린아키텍처 기반으로 계층별 모듈화를 진행할 때 LiveData만을 위해 안드로이드 의존성을 추가해야 하는 문제가 발생했다.
Technical Solution
- LiveData를 StateFlow로 대체: MutableStateFlow<UIState>를 ViewModel에서 선언하고 private _state → public val state로 외부 노출
- ViewModel의 collectLatest로 use case 결과 수신: onStart에서 UIState.Loading, catch에서 UIState.Error, collectLatest에서 UIState.Success로 상태 업데이트
- Activity/Fragment에서 launchWhenStarted 적용: StateFlow의 생명주기 미인식을 보완하기 위해 lifecycleScope.launchWhenStarted로 collect 타이밍 제어
- StateFlow의 Hot Stream 특성 활용: 여러 collector가 구독할 때 최신 값을 재계산 없이 제공하도록 설정
- Domain Layer를 Kotlin 순수 코드로 유지: LiveData 대신 Flow를 사용해 안드로이드 프레임워크 의존성 제거
Impact
아티클에 정량적 수치 없음
Key Takeaway
StateFlow는 항상 최신 값을 보유한 Hot Stream으로 LiveData의 상태 관리 기능을 대체하면서도 Kotlin 언어 의존성만 유지해 클린아키텍처의 계층 독립성을 확보할 수 있다.
실천 포인트
클린아키텍처를 도입한 Android 프로젝트에서 Domain Layer의 안드로이드 의존성을 제거하려면 LiveData 대신 StateFlow를 사용하되, Presentation Layer에서는 lifecycleScope의 launchWhenStarted/launchWhenResumed/repeatOnLifeCycle을 조합해 생명주기에 따른 collect 타이밍을 명시적으로 제어해야 한다.