설 연휴 즐겁게 보내셨나요? 2장이 출시된 이후 많은 관심과 피드백을 전달 주셔서 저희는 번역 작업에 더욱 박차를 가하고 있습니다. 💪
저희는 이번 뉴스레터를 통하여 3장 번역 완료 소식과 몇 가지 Jetpack Compose에 대한 최신 소식을 전하고자 합니다.
제 3장 Compose 런타임 (Compose Runtime) 번역 완료 🚀
여러분들의 성원과 다양한 피드백으로 3장 <Compose 런타임>의 번역이 예정대로 잘 완료되었습니다. 3장은 Jetpack Compose 메커니즘의 핵심적인 구성 요소 중 하나인, Compose 런타임에 대한 내용을 다룹니다.
Compose 런타임은 Compose 컴파일러와 마찬가지로, 특정 플랫폼에 의존적이지 않은 독립적인 메커니즘을 가지고 있습니다. 런타임이 우리가 사용하는 Composable 함수를 실제 어떻게 활용하여 노드의 인메모리 구조를 생성하고 관리하는지, 어떻게 composition 단계로 변경사항을 알리고, recomposition을 수행하는지 등 그동안 많은 의문을 가져왔을 런타임의 내부 동작에 대하여 아래 내용들을 면밀하게 살펴봅니다.
Composable 함수의 인메모리 자료구조인 슬롯 테이블 (Slot Table)에 대하여 자세히 살펴보고, 이를 통해 어떠한 형태로 Composition의 상태가 저장되고 변경되는지, 어떤 종류의 그룹들이 어떻게 저장되는지 등에 대하여 면밀하게 살펴봅니다.
인메모리에 값을 저장하여 recomposition 시에 해당 값을 유지하기 위해 사용하는 "remember" 함수는 실제 런타임시에 메모리에 어떻게 저장되는지, 해당 값이 바뀔 때마다 관찰자 측에서는 어떤 현상이 일어나는지 등에 대하여 살펴봅니다.
Recomposition이 발생했을 때 스마트 recomposition을 가능하게 하기 위해 재구성 범위를 어떻게 모델링하는지 살펴봅니다.
Compose 런타임이 최종적으로 트리를 구체화하는 데 사용하는 추상체인 Applier를 이용하여 노드 트리를 업데이트하기 위해 어떻게 트리 구조를 탐색하고, 어떤 형태로 활용하는지에 대하여 살펴봅니다.
Composable 노드의 트리를 생성하는 방법(상향식 및 하향식)의 차이에 대하여 알아보고, 각 방법들이 성능에 어떠한 영향을 미치는지 비교를 통해 살펴봅니다.
그동안 다루었던 Composition을 생성하는 주체가 누구인지, 어떻게, 언제 생성되는지, 또는 어떤 단계가 연관되어 있는지 하나씩 살펴봅니다.
Recomposition을 수행하는 Recomposer란 무엇이며, 언제 생성되는지, 어떤 상태를 갖는지 등에 대하여 살펴봅니다.
Compose 1.6.0 릴리스
Jetpack Compose는 꾸준히 더 나은 형태로 진화하고 있으며, 지난달 24일에 Compose 1.6.0이 릴리스 되었습니다. 1.6.0에서는 1.5.x 대비 전반적으로 퍼포먼스 향상에 초점을 맞추고 있으며, 아래와 같은 변경 사항이 포함되어 있습니다.
퍼포먼스 개선
Compose의 퍼포먼스 개선은 안드로이드 팀에서 지속적으로 최우선시해왔으며, 이번 Compose 릴리스에서는 전반적으로 퍼포먼스가 크게 향상되었습니다. 특히 각종 리스트(Text, Lazy Lists, Graphics API 등)의 스크롤 퍼포먼스가 약 20%가량 상승했으며, 벤치마크 상으로 약 12%가량 스타트업 시간이 향상되었습니다. 이는 작년 8월에 공개했던 스크롤 퍼포먼스 향상에 이어 추가적으로 향상된 것을 의미합니다. 추가적으로 Modifier.Node를 사용한 커스텀 Modifier에 대한 새로운 가이드가 공개되었습니다.
외부 클래스에 대한 안전성 관리
Compose 컴파일러 1.5.5부터는 외부 모듈로부터 제공되는 클래스 또한 환경 설정 파일을 통해 stable로 마킹할 수 있는 기능을 제공합니다. 본인이 개발하고 있는 별도의 모듈, 외부로부터 참조하는 서드파티 라이브러리 등, 모든 종류의 클래스에 대해서 직접적으로 stability를 선언할 수 있고, 더 이상 stability 마킹을 위해 wrapper 클래스를 만들 필요가 없습니다. 이에 대한 자세한 사항은 문서를 확인하시길 바랍니다.
Jetpack Compose Internals의 2장 <Compose 컴파일러>에서 stability 마킹과 관련한 어노테이션인 "@Stable" 및 "@Immutable"를 Compose 컴파일러가 recomposition을 위해 어떻게 활용하는지, 해당 어노테이션들을 어떤 의미로 해석하고 처리하는지 등에 대하여 자세하게 다루고 있으니 해당 내용도 함께 살펴보시면 이해하시는 데에 많은 도움이 됩니다.
Strong Skipping Mode
최근 Compose 컴파일러 1.5.4 이후의 릴리스에서는 "strong skipping mode"를 실험적으로 지원합니다. 이 모드를 활성화하면 어떤 변경 사항이 recomposition을 건너뛸 수 있는지 판단하는 규칙을 일부 완화하여 Composable 함수에 동일한 객체 인스턴스가 매개변수로 전달되는, 경우 unstable 한 매개변수조차 recomposition을 생략할 수 있도록 합니다. 이 기능은 Compose 1.7에서 디폴트로 활성화되는 것을 목표로 하고 있습니다. 이에 대한 내용은 가이드를 확인하시길 바랍니다.
Compose Multiplatform 1.5.12
Kotlin Multiplatform 유저에게 좋은 소식입니다. Compose 컴파일러 1.5.8과 Kotlin 1.9.22를 지원하는 Compose Multiplatform 1.5.12가 출시되었습니다. 자세한 사항은 GitHub의 릴리스 노트를 확인하시길 바랍니다.추가적으로 1.6.0-beta02 또한 함께 릴리스 되었는데, 1.6.x 버전에서는 Compose UI의 1.6.x 버전에 맞추어 업데이트가 진행되고 있다는 점을 함께 확인하실 수 있습니다.
Jetpack Compose Internals 한국어 번역 프로젝트를 응원해주신 모든 분들께 항상 감사의 말씀을 전해드리며, 이 책과 함께 성장해나가는 2024년이 되시길 기원합니다.