노드 연결 및 그리기
트리에 노드를 삽입하는 것이 궁극적으로는 우리가 보는 스크린 화면에 어떻게 반영되는 걸까?
LayoutNode는 이러한 처리를 위해 Android UI에서 채택된 노드 중 하나다.
UiApplier을 구체화한 LayoutNode에게 삽입을 위임하면 다음과 같은 순서로 수행된다.
- 노드 삽입을 위한 조건이 충족되었는는지 확인한다. 가령, 부모 노드가 없는지 등을 확인한다.
- Z 인덱스에서 정렬된 자식 목록을 Invalidate 한다. Z 인덱스별로 모든 자식을 정렬하여 저장하는 병렬 목록으로 자식 노드들이 순서대로 그려질 수 있다.
- 새 노드를 부모 노드 및 Owner에 연결한다.
- 최종적으로 invalidate를 수행한다.
여기서 말하는 Z 인덱스란 앞서 말한 것처럼 Compose UI는 트리 구조를 가지며, 기본적으로 부모 노드 내부의 자식 노드들은 선언된 순서대로 그려지게 된다. Z-Index가 높은 노드일수록 더 위쪽에 그려지며, 낮은 Z-Index를 가진 노드들은 아래쪽에 배치된다.
Owner는 트리의 루트에 위치해 있으며, Composable 트리를 기본 뷰 시스템과 연결하는 역할을 한다. 이 작업은 AndroidComposeView에 의해 구현되며 모든 레이아웃, 그리기, 입력, 접근은 Owner를 통해 연결된다.
LayoutNode는 화면에 표현되기 위해서 Owner에 연결되며, 그 Owner는 부모의 Owner와 동일해야 한다.
노드를 연결한 후에는 Owner를 통해 invalidate를 호출하여 Composable 트리를 렌더링 한다.
이 구성을 시각화하면 이렇다.

이러한 행위는 Activity, Fragment, ComposeView에서 setContent를 호출할 때마다 발생하며, 해당 시점에서 AndroidComposeView가 생성되어 View 계층에 연결되고 Owner로 설정되어 요구에 따라 invalidate를 수행한다.
Composition
Composition을 생성하는 주체와 생성과정, 타이밍에 대해 알아보자.
Composer가 Composition에 대한 참조를 가지고 있지만, 이 때문에 Composer가 Composition을 생성하고 소유하고 있는 것으로 보일지 몰지만 실제로는 아니다.
Composition이 생성될 때 Composer가 자동으로 만들어지게 되며 composition 참조를 통해 composition이 관리하는 트리를 생성하고 업데이트한다.
클라이언트(UI) 라이브러리는 아래 두 가지의 진입점을 통해 Jetpack Compose Runtime에 접근할 수 있다.
- Composable 함수 작성은 관련된 모든 정보를 방출하고, 해당 함수들의 활용 사례를 런타임과 연결한다.
- Composable 함수는 스스로 실행할 수 없고 Composition 프로세스가 반드시 필요하다. 그래서 setContent와 같은 진입점이 필요하며 이를 통해 Composition이 생성되고 시작된다.
'Android' 카테고리의 다른 글
[Android] Compose 런타임 - (11) (0) | 2024.12.11 |
---|---|
[Android] Compose 런타임 - (10) (0) | 2024.12.09 |
[Android] Compose 런타임 - (8) (0) | 2024.12.04 |
[Android] Compose 런타임 - (7) (0) | 2024.12.03 |
[Android] Compose 런타임 - (6) (0) | 2024.12.02 |