Jetpack Compose가 상태 변경을 관찰해 Composable을 다시 실행하는 recomposition과, 입력값이 같은 영역을 건너뛰는 smart recomposition을 설명하고 불필요한 UI 작업을 줄이는 최적화 전략을 다룬다. 동시에 안정성 계약을 잘못 쓰면 화면 갱신이 누락되는 함정도 경고한다.
핵심 포인트- 명령형 XML View는 뷰를 찾아 값을 갱신하지만 Compose는 상태를 읽은 Composable을 다시 실행 — smart recomposition은 입력이 바뀐 Composable만 다시 그리고 값이 같으면 건너뛰되, 런타임에 변할 수 있는 List 인터페이스는 불안정으로 보아 보수적으로 재실행
- 불변 컬렉션을 쓰면 Compose가 값 불변을 신뢰해 건너뛰기 최적화를 적용하지만, @Immutable·@Stable은 데이터를 실제로 불변으로 만드는 게 아니라 개발자가 보장하는 계약이라 변경 가능한 값에 붙이면 상태가 바뀌어도 화면이 안 갱신되는 버그 발생
- LazyColumn 항목을 위치로만 식별하면 맨 앞 삽입 시 전체 인덱스가 바뀌어 재계산되므로 items의 key에 고유 ID를 넘겨 위치가 이동해도 같은 항목으로 인식, 기존 항목의 recomposition 생략
- Compose 작업을 composition·layout·draw로 나누고 자주 변하는 값을 늦은 단계에서 읽기 — 스크롤 위치를 Modifier.offset 람다 안에서 읽으면 layout부터 재실행돼 더 비싼 composition을 매 프레임 반복하지 않음
왜 읽나Compose 화면 성능을 다듬으려는 Android 개발자에게 안정성 계약·LazyColumn key·지연 읽기로 recomposition을 줄이는 방법과 그 부작용을 함께 짚어주는 10분 톡.