Jetpack Compose의 아키텍처 계층 구조
Jetpack Compose의 아키텍처 계층 구조
Jetpack Compose는 하나의 거대한 모놀리식 툴킷이 아니라, 계층화된 모듈형 프레임워크로 설계되어 있습니다. 각 계층은 하위 계층의 컴포넌트 위에 구축되며, 위로 올라갈수록 더 높은 수준의 추상화와 편의성을 제공합니다. 동시에 개발자가 사용 사례에 맞는 적절한 수준의 제어권을 선택할 수 있도록 유연성도 유지하고 있습니다. 이러한 계층 구조를 이해하면 컴포넌트 커스터마이징, 성능 최적화, 커스텀 디자인 시스템 구축 등 다양한 상황에서 큰 도움이 됩니다. 특히 면접에서는 단순히 계층 이름만 나열하는 것이 아니라, 각 계층이 어떤 역할을 하고 왜 분리되어 있는지를 설명할 수 있어야 좋은 인상을 남길 수 있습니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
- Runtime, UI, Foundation, Material 네 가지 아키텍처 계층을 식별하고 각 계층의 역할을 파악할 수 있습니다.
- 각 계층이 무엇을 제공하며 어떤 하위 계층에 의존하는지 설명할 수 있습니다.
- 컴포넌트를 커스터마이징하거나 새로 구축할 때 어떤 계층을 대상으로 해야 하는지 판단할 수 있습니다.
- Material 컴포넌트의 내부 컴포지션을 이해하고, 필요에 따라 포크(fork)하여 변형 컴포넌트를 만들 수 있습니다.
- 멀티 모듈 프로젝트에서 필요한 모듈만 임포트하여 의존성을 최소화하는 전략을 세울 수 있습니다.
Runtime 계층
Runtime 계층은 Compose의 가장 기초가 되는 토대입니다. 선언적(declarative) 프로그래밍 모델을 가능하게 하는 핵심 프리미티브(primitive)를 포함하고 있으며, 여기에는 @Composable, remember, mutableStateOf, SideEffect, 그리고 스냅샷 상태(snapshot state) 시스템이 해당됩니다. 이 계층은 리컴포지션(Recomposition) 엔진과 상태 관리 기능을 제공하지만, UI 렌더링에 대한 정의는 포함하지 않습니다.
Runtime 계층은 UI가 아닌 시나리오에서도 독립적으로 사용할 수 있습니다. 가령, 상태 홀더(state holder)나 반응형 데이터 계층처럼 Compose의 반응성(reactivity)만 필요하고 렌더링은 불필요한 라이브러리라면 compose-runtime에만 의존하면 됩니다. Cash App의 Molecule 프로젝트가 대표적인 사례로, UI 컴포넌트 없이 Compose 런타임만 활용하여 반응형 상태 머신(state machine)을 구축하고 있습니다. 이처럼 Runtime 계층의 독립적 활용 가능성은 Compose의 핵심 설계 철학 중 하나이며, 단순한 UI 프레임워크를 넘어서는 범용적 반응형 시스템으로서의 가능성을 보여 줍니다.
UI 계층
UI 계층은 Runtime 위에 구축되며, 렌더링에 필요한 핵심 시스템을 제공합니다. LayoutNode를 통한 레이아웃 측정, DrawScope를 통한 드로잉, Modifier 체인, 입력 처리, 포커스 관리, 텍스트 렌더링 등이 이 계층에 포함됩니다. 커스텀 UI 컴포넌트를 처음부터 구성하는 데 필요한 도구가 모두 이 계층에 있습니다.
Layout 컴포저블이 이 계층에 위치하며, 커스텀 측정(measurement)과 배치(placement) 로직을 직접 정의할 수 있게 해 줍니다. Modifier 시스템도 이 계층의 일부로, 레이아웃 노드를 감싸는 데코레이션 체인(패딩, 크기 조절, 드로잉, 입력 처리 등)을 제공합니다. 기존에 존재하는 어떤 레이아웃 패턴에도 들어맞지 않는 완전히 새로운 컴포넌트가 필요하다면, 바로 이 UI 계층에서 직접 구축해야 합니다.
Foundation 계층
Foundation 계층은 특정 디자인 시스템에 종속되지 않는 범용 빌딩 블록을 제공합니다. Row, Column, Box, LazyColumn, LazyRow, 제스처 디텍터(gesture detector), 스크롤 동작, 기본 인터랙티브 컴포넌트 등이 여기에 포함됩니다. Material Design에 종속되지 않으면서 고유한 디자인 시스템이나 레이아웃 구조를 만들기 위한 기반 역할을 합니다.
Material Design 가이드라인을 따르지 않는 커스텀 디자인 시스템을 구축하는 경우, Foundation 계층에만 의존하고 Material 계층은 완전히 건너뛸 수 있습니다. 이렇게 하면 구조적 컴포넌트를 모두 활용하면서도 테마, 타이포그래피, 컴포넌트 스타일링에 대한 완전한 자유를 확보할 수 있습니다. 실제 프로덕션 앱 중에서도 브랜드 아이덴티티가 Material Design과 크게 다른 시각적 언어를 요구하는 경우, 이러한 접근 방식을 많이 채택하고 있습니다.