Jetpack Compose 기본 용어들 제대로 알아보기

Jetpack Compose 숙련자를 향한 첫 걸음

Ji Sungbin
성빈랜드
6 min readAug 7, 2022

--

Photo by Simon Hurry on Unsplash

모든 컴포즈 시스템은 위치 메모이제이션과 SlotTable 을 바탕으로 설계됐습니다. 따라서 컴포즈 용어들을 제대로 이해하기 위해선 이 2개의 개념을 먼저 알아봐야 합니다.

각각 개념들의 자세한 설명은 아래 글들에서 확인하실 수 있습니다.

간단하게 설명하자면 다음과 같습니다.

  • 위치 메모이제이션: 같은 위치에서 같은 input 으로 호출되면 항상 같은 output 이 나올 것이라고 가정하고, 값을 캐싱하고 재사용 하는 기술
  • SlotTable: 발생한 컴포지션에 대한 정보들이 저장되는 공간

이제 이 글의 주제인 컴포즈 기본 용어들에 대해 설명하겠습니다. 가장 기본적이고 자주 사용되는 용어인 컴포지션 부터 보겠습니다.

슬릇 테이블에 초기 갭이 할당되고 최초 상태의 컴포저블 데이터가 등록되는 것을 컴포지션 이라고 부릅니다.

이후 상태 변경으로 인해 컴포저블이 변동되어 슬릇 테이블에 값 업데이트가 진행되는 것을 리컴포지션 이라고 합니다. 이 때, 컴포저블의 멱등성의 보장으로 상태 변경의 영향을 받은 컴포저블 의외의 다른 데이터들은 업데이트를 하지 않고 기존에 있던 값을 그대로 사용합니다. 이렇게 상태 변경에 영향을 받은 부분만 슬릇 테이블 업데이트를 진행하는 것을 스마트-리컴포지션 이라고 합니다.

다음으로 컴포지션으로 구성된 슬릇 테이블을 읽고 UI 트리를 구축하는 과정을 방출 이라고 합니다.

마지막으로 방출된 트리를 읽고 실제로 UI 로 그리는 과정을 구체화 라고 합니다. 구체화 과정은 컴포즈에서 재설계한 안드로이드의 컨버스를 이용해서 진행됩니다. 이렇게 3개의 과정(컴포지션-방출-구체화)을 걸쳐서 컴포저블이 실제로 그려지게 됩니다.

여기까지의 소개에서 한 가지 빠진 점이 있습니다. 컴포즈에서는 상태의 변경을 어떻게 감지하고, 변경에 맞게 리컴포지션을 진행하는 걸까요?

정답은 스냅샷 시스템에 있습니다. 모든 상태는 스냅샷 시스템에 의해 관리됩니다. 스냅샷 시스템은 컴포즈에서 추적할 수 있는 상태를 만드는데 사용되고, mutableStateOf 를 이용하여 변경 가능한 상태를 만들 수 있습니다. 스냅샷 시스템은 내부에서 MVCC 를 이용하여 동시성을 고려하여 설계됐습니다. 따라서 thread-safe 하게 상태에 접근할 수 있습니다.

스냅샷 시스템에 대한 자세한 설명은 아래 글을 참고해 주세요.

모든 컴포저블은 슬릇 테이블의 그룹에 저장됩니다. 이어서 컴포즈에서 의미하는 “그룹” 에 대해 설명하겠습니다.

모든 컴포저블들은 슬릇 테이블에 저장된다고 설명했습니다. (모든 컴포저블은 컴포지션 과정을 거치게 되고, 컴포지션에 의해 슬릇 테이블에 저장됩니다)

이 컴포저블이 표시하는 데이터인 Column Data 처럼, 표시하려는 데이터가 슬릇 테이블에 저장되기 까지의 모든 상위 컴포저블 컨테이너 들을 그룹 이라고 부릅니다. 그룹은 3가지로 나뉩니다.

먼저 RestartableGroup 입니다. 이 그룹은 리컴포지션이 일어날 수 있는 컴포저블 주위로 생성됩니다.

별도의 옵션이 없다면 모든 컴포저블에 대해 생성되는 그룹이고, 리컴포지션 하는 방법을 가르칩니다. 모든 RestartableGroup 은 해당 범위 만큼 자체의 리컴포지션 스코프를 형성합니다. 이 리컴포지션 스코프를 컴포즈 내부에서는 RecomposeScope 라고 부릅니다.

다음으로 ReplaceableGroup 입니다. 이 그룹은 분기에 따라 재배치 될 수 있는 컴포저블 주위로 생성됩니다.

그룹을 교체해야 할 때 슬릇 테이블에 저장된 데이터를 정리하는 방법을 가르칩니다.

마지막으로 MovableGroup 입니다. 컴포저블이 배치된 위치가 달라지면 위치 메모이제이션의 key 가 달라져서 슬릇 테이블에 저장된 데이터가 초기화됩니다. 데이터를 유지한 상태로 위치를 옮기기 위해선 key 컴포저블을 이용해 위치 메모이제이션에서 참고할 key 를 직접 정의해야 합니다.

key 컴포저블을 이용해 배치된 컴포저블은 주위로 MovableGroup 이 생성됩니다. MovableGroup 은 컴포저블이 위치 메모이제이션의 key 와 데이터를 항상 보존하며 이동하는 방법을 가르칩니다.

끝!

이번 글에서는 컴포즈를 사용하는데 알고 있으면 도움될 기본 용어들에 대해 소개해 드렸습니다. 도움이 되길 바랍니다.

안드로이드 개발자 분들을 위한 카카오톡 오픈 채팅방을 운영하고 있습니다. (96/100)

--

--

Ji Sungbin
성빈랜드

Experience Engineers for us. I love development that creates references.