[Compose] Compose Runtime

easyhooon·2025년 10월 20일
post-thumbnail

Jetpack Compose Internals 책을 읽고, 몰랐던 내용을 정리하고, 책에 언급된 내용에 대한 딥다이브 및 스터디 시간에 얘기 나누면 좋을 내용들을 적어보는 글입니다.

내용 보충 필요!

Composable 함수는 실제 UI를 직접 생성하지 않는다.

Composer를 통해 Compose Runtime이 관리하는 메모리 내 구조(slot table)에 변경사항을 '방출(emit)' 한다.

Composer가 slot table에 변경사항을 기록한다고 해석하면 될듯하다.

이 표현(representation)은 나중에 '해석'되어 실제 UI로 '구체화(materialize)'된다.

해석 및 구체화는 Applier가 담당을 하는데 이는 이후에 살펴보도록 하겠다.

Slot Table

트리 구조의 메모리 내 데이터 구조로, Composition의 현재 상태를 저장한다. Gap buffer 방식으로 구현되어 있어 삽입/삭제가 효율적이다.

주요 특징

  • 각 Composable의 identity, 파라미터, 상태를 그룹 단위로 저장
  • Recomposition 시 이전 값과 비교하여 변경사항 감지
  • Positional memoization을 통해 불필요한 재실행 방지
  • 그룹(Group) 구조: 시작 마커 + 데이터 슬롯들 + 종료 마커로 구성되며, key를 통해 식별

SideEffects

Composer는 사이드 이펙트도 기록할 수 있다. 사이드 이펙트는 항상 Composition 이후에 실행된다.

종류별 실행 시점

  • SideEffect: 매 성공적인 Recomposition 이후
  • DisposableEffect: Composition 진입/이탈 시
  • LaunchedEffect: Composition 내 코루틴 실행

왜 나중에 실행되나?

Composition 단계는 순수해야 하므로 외부 상태 변경이나 비동기 작업은 별도 단계에서 처리된다. Composer는 사이드 이펙트를 큐에 저장했다가 Composition이 완료된 후 apply 단계에서 실행한다.

CompositionLocal

Composer는 CompositionLocals를 등록하고 키를 통해 해당 값을 획득하는 방법을 제공한다.
CompositionLocal.current 호출은 이에 의존한다.

CompositionLocals의 공급자와 공급되는 값은 모두 Slot Table에 그룹의 형태로 저장된다.

Applier

Slot table의 변경사항을 실제 UI 트리에 반영하는 역할을 한다.

주요 구현체

  • UiApplier: Android View 계층 구조에 적용
  • VectorApplier: VectorPainter의 노드 트리에 적용

동작 방식

  • Slot table의 변경 사항(operations)을 순회
  • insertTopDown(), remove(), move() 등의 메서드로 실제 UI 트리 조작
  • 플랫폼별로 다른 Applier 구현체를 사용하여 멀티플랫폼 지원

Composition의 추상적 표현을 구체적인 UI로 변환하는 브리지 역할

Recomposer

Composition의 생명주기를 관리하고 State 변경을 감지하여 Recomposition을 트리거한다.

주요 역할

  • Snapshot system과 연동하여 상태 변경 감지
  • 무효화(invalidation)된 Composable들을 추적
  • Recomposition 스케줄링 및 실행 조율

동작 흐름

  • State 변경 시 snapshot observer가 감지
  • 해당 Composable을 invalidation scope에 표시
  • Recomposer가 프레임 타이밍에 맞춰 Recomposition 실행
  • 변경된 부분만 선택적으로 재실행 (Smart Recomposition)

coroutineContext와의 관계

Recomposer는 CoroutineContext를 가지고 있어 Composition을 비동기적으로 관리한다.

profile
실력은 고통의 총합이다. Android Developer

0개의 댓글