AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Jetpack Compose 상태 관리에서 자주 범하는 실수

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • Jetpack Compose를 사용하는 Android 개발자*
  • 중간 이상의 경험을 가진 상태 관리와 성능 최적화에 관심 있는 개발자*

핵심 요약

  • 상태를 Composable의 최상위에 집중적으로 선언하면 불필요한 재구성 발생
  • MutableMap과 같은 불안정한 데이터 타입 사용 시 Compose의 안정성 메커니즘 무시
  • rememberderivedStateOf 사용을 통해 계산 비용 최소화 및 자동 상태 동기화 구현
  • ViewModel을 Composable 내부에서 직접 생성하는 실수로 인한 상태 불일치

섹션별 세부 요약

1. 상태 위치 오류

  • 상태를 Composable의 최상위에 선언하면, 관련 없는 데이터 변경 시 전체 재구성 발생
  • 예: userStatepostsState를 Composable 최상위에 선언
  • 해결: 사용 영역 근처에서 상태 값을 읽도록 재구성

2. 불안정한 데이터 타입 사용

  • MutableMap과 같은 불안정한 타입 사용 시 Compose의 안정성 메커니즘 무시
  • 예: preferences: MutableMap로 선언
  • 해결: @Immutable 또는 @Stable 어노테이션 사용, 불변 데이터 타입으로 변경

3. Composable 내부에서 ViewModel 생성

  • ProductViewModel()을 Composable 내부에서 직접 생성하여 매번 새로운 인스턴스 생성
  • 예: val viewModel = ProductViewModel()
  • 해결: hiltViewModel() 또는 viewModel() 프로바이더 사용

4. 비용 있는 연산 미캐시화

  • ExpensiveCalculation에서 remember 미사용으로 매번 연산 재실행
  • 예: data.filter().groupBy().mapValues()
  • 해결: remember(data)로 연산 결과 캐시

5. 별도 상태로 계산 값 관리

  • total 상태를 items 상태와 별도로 관리하여 수동 동기화 필요
  • 예: var total by remember { mutableStateOf(0.0) }
  • 해결: derivedStateOf { items.sumOf { ... } } 사용

결론

  • @Stable@Immutable 어노테이션을 통해 상태 안정성 강화
  • Compose 컴파일러 리포트(reportsDestination)를 활용한 불안정 요소 식별
  • rememberderivedStateOf를 통해 성능 최적화 및 자동 상태 동기화 구현