UI 상태와 리소스

하이솝·2026년 4월 12일

학습 목표

  • 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"라고 표시

테마 및 스타일 대응

  • 이미지나 색상 리소스를 사용하면 다크 모드나 라이트 모드에 맞춰
    시스템이 자동으로 최적의 리소스를 선택

유지보수 효율성

  • 앱 전체에서 공통으로 사용되는 단어(예) 앱 이름, 확인, 취소)를
    리소스로 관리하면, 나중에 수정해야 할 때 파일 한 곳만 고치면 됨

0개의 댓글