면접 질문 목록으로 가기
면접 질문실전 질문꼬리 질문

Jetpack Compose의 snapshotFlow

skydovesJaewoong Eum (skydoves)||7분 소요

Jetpack Compose의 snapshotFlow

snapshotFlow는 Compose의 상태 관찰 시스템과 Kotlin의 Flow API를 연결해 주는 다리 역할을 합니다. Compose 스냅샷(Snapshot) 내부에서 읽힌 상태 값을 cold Flow로 변환하여, 관찰 중인 상태가 변경될 때마다 새로운 값을 방출합니다. 덕분에 filter, debounce, combine 등 표준 Flow 연산자를 Compose 상태 변경에 적용할 수 있으며, 분석(analytics) 이벤트 전송, 로깅, 또는 UI 상태 전환에 따른 백엔드 호출 같은 사이드 이펙트(side-effects) 처리에 매우 유용합니다.

이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • snapshotFlow가 Compose 스냅샷 시스템을 통해 상태 변경을 관찰하는 원리를 설명할 수 있습니다.
  • 컴포저블 함수 내에서 직접 상태를 관찰하는 방식 대비 snapshotFlow를 선택해야 하는 상황을 판단할 수 있습니다.
  • snapshotFlowLaunchedEffect와 결합하여 생명주기를 인식하는 수집(collection)을 수행하는 방식을 파악할 수 있습니다.
  • snapshotFlow에 Flow 연산자를 적용하여 상태 방출을 쓰로틀링(throttling)하거나, 필터링하거나, 결합하는 패턴을 실무에 활용할 수 있습니다.

snapshotFlow의 동작 원리

snapshotFlow는 람다 블록을 받아 Compose 스냅샷 내부에서 실행합니다. 실행 도중 스냅샷 시스템은 읽힌 모든 상태 객체를 기록합니다. 이후 기록된 상태 객체 중 하나라도 변경되면, 시스템이 람다를 다시 평가하고 새로운 결과를 Flow로 방출합니다. 아래 예제 코드를 통해 기본적인 사용법을 확인해 보겠습니다.

@Composable
fun TrackScrollPosition(listState: LazyListState) {
    LaunchedEffect(Unit) {
        snapshotFlow { listState.firstVisibleItemIndex }
            .collect { index ->
                analytics.logScrollPosition(index)
            }
    }
}

위의 예제에서 snapshotFlowLazyListStatefirstVisibleItemIndex를 관찰합니다. 사용자가 스크롤하여 첫 번째로 보이는 아이템이 변경될 때마다 Flow가 새로운 인덱스를 방출하게 됩니다. 수집은 LaunchedEffect 내부에서 이루어지기 때문에, 코루틴의 생명주기가 해당 컴포저블이 컴포지션에 존재하는 기간에 자동으로 연결됩니다. 즉, 컴포저블이 컴포지션에서 제거되면 수집도 함께 취소되므로 메모리 누수를 걱정하지 않아도 됩니다.

스냅샷 시스템과의 통합

Compose 스냅샷 시스템은 상태의 읽기와 쓰기를 추적하는 핵심 메커니즘입니다. snapshotFlow가 람다를 평가할 때, 읽기 전용 스냅샷을 생성하고 실행 도중 접근한 모든 State 객체를 기록합니다. 이후 해당 상태 객체들에 변경 옵저버를 등록합니다.

상태 객체가 쓰기 연산(예를 들어 mutableStateOf 값 변경)을 통해 수정되면, 스냅샷 시스템이 snapshotFlow에 의존성 변경을 알려 줍니다. 그러면 람다가 다시 평가되고, 이전에 방출한 값과 결과가 다를 경우에만 새로운 값이 Flow 하류(downstream)로 전달됩니다.

여기서 중요한 점은 snapshotFlow계산된 결과가 실제로 변경된 경우에만 방출한다는 것입니다. 두 개의 서로 다른 상태 객체가 변경되더라도 람다가 동일한 결과를 산출하면 방출이 발생하지 않습니다. 이렇게 내장된 중복 제거(distinctness) 기능 덕분에 하류에서 불필요한 처리를 피할 수 있습니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기
면접 질문 목록으로 가기