Jetpack Compose 상태 관리에서 자주 범하는 실수
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- Jetpack Compose를 사용하는 Android 개발자*
- 중간 이상의 경험을 가진 상태 관리와 성능 최적화에 관심 있는 개발자*
핵심 요약
- 상태를 Composable의 최상위에 집중적으로 선언하면 불필요한 재구성 발생
MutableMap
과 같은 불안정한 데이터 타입 사용 시 Compose의 안정성 메커니즘 무시remember
와derivedStateOf
사용을 통해 계산 비용 최소화 및 자동 상태 동기화 구현- ViewModel을 Composable 내부에서 직접 생성하는 실수로 인한 상태 불일치
섹션별 세부 요약
1. 상태 위치 오류
- 상태를 Composable의 최상위에 선언하면, 관련 없는 데이터 변경 시 전체 재구성 발생
- 예:
userState
와postsState
를 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
)를 활용한 불안정 요소 식별 remember
와derivedStateOf
를 통해 성능 최적화 및 자동 상태 동기화 구현