학습 목표
- UI 상태 관리와 관련 패턴에 대해 이해하고 설명할 수 있다.
- Compose의 상태 관리 패턴을 이해하고 사용할 수 있다.
- 상태 호이스팅을 이해하고 구현할 수 있다.
- ViewModel과 StateFlow를 이해하고 사용하여 UI를 구현할 수 있다.
- 리소스의 필요성을 이해하고 사용할 수 있다.
UI 상태 관리(UI State Management)
-
기존 안드로이드 View(명령형 UI)에서는
컴포넌트를 find해서 해당 컴포넌트의 데이터를 수정
-
Compose UI는 상태(State)의 함수, UI는 상태에 따라 변경됨
로컬 상태: 특정 화면 내에서만 쓰이는 임시 데이터(예) 입력창의 텍스트)
전역 상태: 앱 전체에서 공유되는 데이터 (예) 로그인 유저 정보, 장바구니)
-
상태가 변경되면 해당 상태를 이용하는 컴포저블 함수가 다시 실행
리컴포지션, Recomposition
상태 관리 패턴
상태 호이스팅(State Hoisting)
-
컴포저블을 재사용 가능하고 테스트하기 쉽게 만들기 위해
상태를 위쪽(Caller)으로 올리는 패턴
-
가능한 한 pure funciton으로 만들어서 관리
-
방법: 상태 변수 대신 value와 onValueChange 이벤트 콜백을 파라미터로 전달
-
장점: Stateless 컴포저블을 만들어 UI 로직과 비즈니스 로직을 분리
단방향 데이터 흐름(Unidirection Data Flow)
Compose의 상태 관리
mutableStateOf와 State<T>
- Compose가 추적할 수 있는 관찰 가능한(Observable) 객체
Compose가 추적할 수 있도록
int, float, double, char, string 등의 데이터 타입을 State로 변경
- MutableState는 값이 바뀌면 Compose에 알림을 보내 리컴포지션을 유발
remember
- 리컴포지션은 함수가 다시 실행되는 과정
- remember를 사용하지 않으면 함수가 다시 실행될 때마다 변수가 초기화
remember를 사용해야 하는 이유
- 역할: 리컴포지션 사이에서 값을 메모리에 보관
- 주의: 기기 회전(Configuration Change)시에는 데이터가 저장되지 않음
이 경우 rememberSaveable을 사용
ViewModel과 StateFlow 통합
상태의 보관소(Storage)와 상태의 전달 통로(Pipe)
ViewModel
- UI 상태를 액티비티 생명 주기에 따라 관리하는 객체
- 액티비티가 완전히 종료될 때까지 상태(데이터)를 유지함
화면 회전 등으로 Configuration Change가 되어 액티비티가 재생성 되더라도 View Model은 유지됨
StateFlow
- 코틀린 코루틴에서 제공, 관찰 가능한 상태의 흐름
- 상태 변수에 저장된 데이터가 변경되면, 이를 관찰하는 대상에게 알림
액티비티(Activity)
사용자와 상호작용 할 수 있는 단일 화면을 의미하는 앱 구성 요소.
리소스 접근이나 시스템 호출에 필요한 Context를 제공

ViewModel과 라이프사이클
viewModel()
- androidx.lifecycle:lifecycle-viewmodel-compose 라이브러리 의존성 추가 필요
- 역할: 현재 컴포저블이 속한 ViewModelStoreOwner(보통 Activity)와 연관된 ViewModel 객체를 찾고 없으면 새로 생성하여 반환
팩토리 패턴
- 함수를 여러번 호출해도 동일한 스코프 내에서는 싱글톤처럼 동일한 인스턴스를 보장
Activity보다 생명주기가 김
- ViewModel 내부에 Activity의 Context를 유지하면 안됨
- 화면 회전 시 Activity는 종료/재생성되더라도 ViewModel 객체는 유효함
State<T>와 StateFlow<T>
State는 Compose 전용
- 값을 읽기만 하면 됨
상태가 바뀌면 바로 리컴포지션 동작
- 컴포저블 함수 내에서 사용
StateFlow는 코틀린 언어의 코루틴에 포함
- 데이터가 변하면 관찰자에게 알림, 이걸 State와 연결해야 리컴포지션 동작
- 보통 ViewModel(), Repository 패턴에서 사용
리소스
다국어 지원(Localization)
- 사용자 기기의 언어 설정에 따라 자동으로 적절한 언어를 표시
- 소스코드에 "확인"이라고 적어두면 영어권 사용자에게도 한국어로 표시되지만,
리소스를 사용하면 자동으로 "OK"라고 표시
테마 및 스타일 대응
- 이미지나 색상 리소스를 사용하면 다크 모드나 라이트 모드에 맞춰
시스템이 자동으로 최적의 리소스를 선택
유지보수 효율성
- 앱 전체에서 공통으로 사용되는 단어(예) 앱 이름, 확인, 취소)를
리소스로 관리하면, 나중에 수정해야 할 때 파일 한 곳만 고치면 됨