Kotlin 태그가 붙은 모든 Dove Letter 아티클입니다. Google Developer Expert (GDE)인 엄재웅 (skydoves)이 직접 작성한 심층 기술 아티클을 한국어로 만나보세요.
Navigation 3는 Jetpack의 Compose 전용 내비게이션을 처음부터 새로 설계한 라이브러리입니다. Navigation 2가 Fragment 기반 내비게이션 모델을 NavController와 XML 그래프 정의를 통해 Compose에 적용한 것과...
sealed class에 대해 when 표현식을 작성하고, 모든 서브클래스를 빠짐없이 처리하면 컴파일러가 else 분기 없이도 코드를 통과시켜 줍니다. 그런데 같은 팀 동료가 다른 파일에 새로운 서브클래스를 하나 추가하는 순간, 프로젝트 내 모든 when...
Jetpack Room을 사용하면 모든 @Dao 인터페이스가 완전한 데이터베이스 구현체로 변환됩니다. Hilt를 사용하면 @Inject 생성자가 의존성 그래프에 자동으로 연결됩니다. Moshi를 사용하면 @JsonClass가 JSON 어댑터를 생성합니다....
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으로 기록됩니다....
코틀린 코루틴Kotlin Coroutines은 JVM에서 비동기 프로그래밍의 표준으로 자리 잡았습니다. 코루틴 덕분에 스레드를 블로킹하지 않으면서도 순차적이고 읽기 쉬운 코드를 작성할 수 있으며, 필요할 때 일시 중단했다가 다시 재개할 수 있습니다. 대부분의...
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는 이전 값과 비교하여 변경이 없을 경우 해당 함수의...
안드로이드의 WorkManager는 영속적이면서도 지연 가능한deferrable 백그라운드 작업을 처리하기 위한 공식 권장 솔루션으로 자리잡았습니다. 앱 프로세스와 함께 생성되고 소멸되는 일시적인 백그라운드 작업과 달리, WorkManager는 사용자가 앱을...
Compose의 derivedStateOf는 계산된 결과가 실제로 변경되었을 때만 리컴포지션Recomposition을 트리거하는 파생 상태derived state를 생성하는 수단을 제공합니다. val fullName by remember {...
최근 안드로이드 애플리케이션은 MVVM이나 MVI 같은 멀티 레이어 아키텍처를 널리 채택하고 있습니다. 이러한 아키텍처에서는 데이터가 데이터 소스, 리포지토리, ViewModel또는 프레젠테이션 레이어과 같은 여러 계층을 거쳐 흐르게 됩니다. 각 계층은 고유한...
Jetpack Compose는 정교한 아이덴티티identity 시스템을 통해 UI 상태를 관리하며, 이를 바탕으로 컴포저블을 재사용할지 아니면 새로 생성할지를 결정합니다. keyuserId { UserCarduser }와 같이 콘텐츠를 감싸면,...
안드로이드의 ViewModel은 가장 널리 사용되는 아키텍처 컴포넌트 중 하나이지만, 핵심 생존 메커니즘survival mechanism을 깊이 이해하는 개발자는 많지 않습니다. 클래스에 어노테이션을 달고 Activity에서 viewModels를 호출하면 화면...
Jetpack Compose는 안드로이드 UI 개발에 선언적declarative 패러다임을 도입했지만, 선언적이라고 해서 상태가 없는 것은 아닙니다. 사용자 인터랙션은 스크롤 위치, 텍스트 필드 내용, 확장된 섹션 등 다양한 상태를 만들어 내며, 이러한 상태는...
Jetpack Compose의 Modifier 시스템은 컴포저블에 시각적 속성을 적용하는 핵심 수단이었습니다. background, padding, border 등의 Modifier를 체이닝하여 UI 요소의 외관과 동작을 구성하는 방식인데, 이 접근법은...
코틀린 코루틴은 구조화된 동시성structured concurrency을 핵심 원칙으로 도입하여, 코루틴이 부모 스코프의 생명주기에 맞게 적절히 관리되고 취소되도록 보장합니다. 이 메커니즘의 중심에는 CancellationException이라는 특수한 예외가...
Landscapist Core는 코틀린 멀티플랫폼Kotlin Multiplatform을 위해 처음부터 새로 설계된 독립형 이미지 로딩 엔진입니다. Landscapist가 제공하는 Coil, Glide, Fresco 래퍼wrapper와 달리, Landscapist...
Jetpack Compose는 선언적declarative UI 코드를 화면의 픽셀로 변환하기 위해 Composition, Layout, Drawing이라는 세 가지 고유한 페이즈로 구성된 파이프라인을 거칩니다. 상태state 변수를 변경하면 Compose는 모든...
Jetpack Compose에서 복잡한 UI를 구현하다 보면, Box, Row, Column 같은 기본 레이아웃만으로는 한계를 느끼는 순간이 찾아옵니다. 물론 이러한 기본 컴포저블composable은 대부분의 일반적인 시나리오를 훌륭하게 처리하지만, 자식 요소의...
Jetpack Compose의 선언적declarative UI 패러다임은 간결함을 약속합니다. 상태의 함수로 UI를 선언하면, 프레임워크가 자동으로 업데이트를 처리합니다. 하지만 이 우아한 추상화 뒤에는 Compose를 놀라울 만큼 효율적으로 만들어 주는 정교한...
안드로이드의 ViewModel은 현대 안드로이드 개발에서 필수적인 컴포넌트로 자리잡았습니다. 구성 변경configuration changes에도 유지되는, 생명주기 인식lifecycle-aware UI 데이터 컨테이너를 제공하기 때문입니다. API 표면만 보면...
이미지 로딩은 안드로이드 개발에서 가장 핵심적이면서도 까다로운 영역 중 하나입니다. 네트워크 통신, 메모리 관리, 스레딩, 캐싱, 비트맵 디코딩 등 여러 복잡한 문제가 한꺼번에 얽혀 있기 때문입니다. Glide나 Picasso 같은 라이브러리가 오랫동안...
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 구조로 설계되어 있습니다. 이 글에서는...
코틀린은 개발자가 일상적으로 마주하는 프로그래밍 문제를 실용적으로 해결하는 언어로 오랫동안 사랑받아 왔습니다. 특히 null 안전성null-safety 시스템은 코틀린의 대표적인 강점 중 하나입니다. 하지만 복구 가능하고 예측 가능한 오류를 다루는 영역에서는...
Google이 최근 공식 runtime-annotation 라이브러리를 출시했습니다. 이 라이브러리는 커뮤니티에서 먼저 만들어진 compose-stable-marker 라이브러리와 유사한 목적을 가지고 있습니다.
Jetpack Compose 생태계는 최근 몇 년간 폭발적으로 성장했으며, 이제 안드로이드 애플리케이션에서 프로덕션 수준의 UI를 구축하는 데 널리 채택되고 있습니다. Jetpack Compose가 안드로이드 UI 개발의 미래라는 점은 이제 누구도 부정하기...
현대 안드로이드 개발 생태계에서 Kotlin과 Java 사이의 시너지는 여전히 매우 중요합니다. 특히 수많은 전통적인 프로젝트가 Java로 작성되어 있기 때문에, 두 언어 간의 원활한 협업은 필수적입니다. 이러한 뛰어난 상호운용성interoperability을...