Compose 태그가 붙은 모든 Dove Letter 아티클입니다. Google Developer Expert (GDE)인 엄재웅 (skydoves)이 직접 작성한 심층 기술 아티클을 한국어로 만나보세요.
Navigation 3는 Jetpack의 Compose 전용 내비게이션을 처음부터 새로 설계한 라이브러리입니다. Navigation 2가 Fragment 기반 내비게이션 모델을 NavController와 XML 그래프 정의를 통해 Compose에 적용한 것과...
Compose의 성능 모델은 하나의 핵심 원칙에 기반합니다. 바로 불필요한 작업을 건너뛰는 것입니다. 런타임이 컴포저블의 입력값이 변경되지 않았음을 증명할 수 있으면, 해당 컴포저블의 재실행을 통째로 건너뜁니다. 이 최적화를 스킵skipping이라고 하며,...
Landscapist는 Jetpack Compose와 코틀린 멀티플랫폼Kotlin Multiplatform을 위한 컴포저블 이미지 로딩 라이브러리입니다. 여러 이미지 컴포저블 중에서도 LandscapistImage가 가장 권장되는 선택지인데, Jetpack...
모든 Compose 앱은 이미지를 그립니다. ImagepainterResourceR.drawable.photo를 호출하여 비트맵을 표시하든, IconIcons.Default.Search로 Material 아이콘을 렌더링하든, 벡터 드로어블vector...
여러분이 작성하는 모든 @Composable 함수는 눈에 보이지 않는 스캐폴딩scaffolding을 생성합니다. Compose 컴파일러는 각 Kotlin 구조를 "그룹group"으로 감싸고, 이 그룹이 리컴포지션Recomposition 과정에서 런타임에 어떤...
Compose를 사용하는 모든 안드로이드 개발자라면 컴포저블 함수 위에 @Preview를 작성하고, Android Studio의 디자인 패널에 UI가 렌더링되는 것을 경험해 보셨을 것입니다. 하지만 이 어노테이션 하나가 실제 렌더링된 픽셀로 변환되기까지...
Jetpack Compose는 겉으로 보기에 UI 툴킷에 불과하지만, 내부적으로는 수십 년에 걸친 컴퓨터 과학 연구 성과를 적극적으로 활용하고 있습니다. 런타임은 텍스트 에디터에서 차용한 자료구조를 사용하여 컴포지션Composition 상태를 저장하며,...
Compose를 사용해 본 개발자라면 누구나 remember { mutableStateOf0 } 코드를 작성해 본 경험이 있을 것입니다. 이 값은 리컴포지션Recomposition이 발생하더라도 별도의 명시적인 저장소 참조 없이 유지됩니다. ViewModel도,...
Jetpack Compose는 전체 컴포지션Composition 트리를 SlotTable이라는 자료구조에 저장합니다. 모든 컴포저블Composable 호출, remember로 기억한 값, 모든 키가 이 테이블 안에 그룹group과 슬롯slot으로 기록됩니다....
Jetpack Compose는 스냅샷Snapshot이라는 시스템을 통해 UI 상태를 관리합니다. 데이터베이스 이론에서 차용한 이 개념은 공유된 가변 상태shared mutable state에 대한 격리된 동시 접근을 지원합니다. var count by...
Jetpack Compose는 선언적declarative 접근 방식으로 안드로이드 UI 개발에 혁신을 가져왔습니다. 하지만 Compose를 진정으로 강력하게 만드는 핵심은 그 이면에 있는 정교한 내부 메커니즘에 있습니다. Compose의...
구글 맵스Google Maps는 대부분의 안드로이드 개발자가 즉시 알아볼 수 있는 바텀 시트bottom sheet 패턴을 대중화했습니다. 화면 하단에서 살짝 올라온 작은 패널이 중간 높이까지 확장되어 간략한 정보를 보여주고, 전체 화면으로 드래그하면 상세 정보를...
Jetpack Compose의 안정성stability 시스템은 컴포저블 함수가 리컴포지션Recomposition 중에 스킵될 수 있는지를 결정합니다. 모든 매개변수가 안정적stable이면, Compose는 이전 값과 비교하여 변경이 없을 경우 해당 함수의...
Compose의 derivedStateOf는 계산된 결과가 실제로 변경되었을 때만 리컴포지션Recomposition을 트리거하는 파생 상태derived state를 생성하는 수단을 제공합니다. val fullName by remember {...
Jetpack Compose는 정교한 아이덴티티identity 시스템을 통해 UI 상태를 관리하며, 이를 바탕으로 컴포저블을 재사용할지 아니면 새로 생성할지를 결정합니다. keyuserId { UserCarduser }와 같이 콘텐츠를 감싸면,...
Jetpack Compose는 안드로이드 UI 개발에 선언적declarative 패러다임을 도입했지만, 선언적이라고 해서 상태가 없는 것은 아닙니다. 사용자 인터랙션은 스크롤 위치, 텍스트 필드 내용, 확장된 섹션 등 다양한 상태를 만들어 내며, 이러한 상태는...
Jetpack Compose의 Modifier 시스템은 컴포저블에 시각적 속성을 적용하는 핵심 수단이었습니다. background, padding, border 등의 Modifier를 체이닝하여 UI 요소의 외관과 동작을 구성하는 방식인데, 이 접근법은...
Jetpack Compose는 선언적declarative UI 코드를 화면의 픽셀로 변환하기 위해 Composition, Layout, Drawing이라는 세 가지 고유한 페이즈로 구성된 파이프라인을 거칩니다. 상태state 변수를 변경하면 Compose는 모든...
Jetpack Compose에서 복잡한 UI를 구현하다 보면, Box, Row, Column 같은 기본 레이아웃만으로는 한계를 느끼는 순간이 찾아옵니다. 물론 이러한 기본 컴포저블composable은 대부분의 일반적인 시나리오를 훌륭하게 처리하지만, 자식 요소의...
Jetpack Compose의 선언적declarative UI 패러다임은 간결함을 약속합니다. 상태의 함수로 UI를 선언하면, 프레임워크가 자동으로 업데이트를 처리합니다. 하지만 이 우아한 추상화 뒤에는 Compose를 놀라울 만큼 효율적으로 만들어 주는 정교한...
Jetpack Compose는 스마트 리컴포지션Smart Recomposition 시스템을 활용하여 UI 업데이트를 최적화합니다. 이 최적화의 핵심에는 안정성 추론stability inference이 자리하고 있습니다. 안정성 추론이란, 특정 타입의 값이 시간이...
동적인 사용자 인터페이스를 구성하는 일은 안드로이드 개발에서 오랫동안 근본적인 과제로 남아 있었습니다. 기존의 전통적인 접근 방식에서는 UI를 변경할 때마다 애플리케이션 전체를 재컴파일하고 다시 배포해야 하며, 이 과정이 A/B 테스트, 피처 플래그feature...
Jetpack Compose에서 Crossfade는 서로 다른 두 UI 상태 간의 전환transition을 간결하고 선언적declarative으로 애니메이션 처리할 수 있는 방법을 제공합니다. Crossfade에 전달된 targetState가 변경되면, 기존...
Jetpack Compose의 derivedStateOf API는 기존 상태state로부터 파생된 메모이제이션 상태를 생성하는 편리한 메커니즘을 제공합니다. 의존하고 있는 상태가 변경될 때 자동으로 업데이트되므로 많은 시나리오에서 성능 최적화에 필수적이지만,...
SlotTable은 Jetpack Compose 애플리케이션의 UI 트리를 메모리에 표현하는 핵심 자료구조입니다. 일반적인 객체 트리 형태가 아니라, 매우 빠른 UI 업데이트를 위해 고도로 최적화된 플랫flat 구조로 설계되어 있습니다. 이 글에서는...
Google이 최근 공식 runtime-annotation 라이브러리를 출시했습니다. 이 라이브러리는 커뮤니티에서 먼저 만들어진 compose-stable-marker 라이브러리와 유사한 목적을 가지고 있습니다.
Jetpack Compose 생태계는 최근 몇 년간 폭발적으로 성장했으며, 이제 안드로이드 애플리케이션에서 프로덕션 수준의 UI를 구축하는 데 널리 채택되고 있습니다. Jetpack Compose가 안드로이드 UI 개발의 미래라는 점은 이제 누구도 부정하기...