Jetpack Compose에서 사이드 이펙트의 문제는 Composable 함수의 재시작 가능(Restartable)하고 반응형(reactive)인 특성에서 비롯되며, 이펙트 핸들러는 이러한 환경에서 예측 가능하고 통제된 방식으로 상태를 관리하기 위해 도입되었습니다. 사이드 이펙트(Side Effect)의 정의와 문제점 사이드 이펙트는 함수 내부에서 외부 상태를 변경하거나 제어를 벗어나 발생하는 예측 불가능한 동작으로, 이런 행위는 비결정성(Non-determinism)을 유발합니다.비결정적 실행 환경: 사이드 이펙트는 동일한 입력에도 매번 다른 결과를 만들어 Composable의 멱등성을 깨뜨린다.재시작 및 병렬 실행: Compose Runtime의 반복, 병렬 실행 시 통제되지 않은 이펙트가 중복 ..
Compose UI의 측정은 LayoutNode 트리를 화면에 렌더링하기 위해 각 UI 요소의 크기와 위치를 계산하는 과정입니다. 이 측정은 Modifier, LayoutNodeWrapper, MeasurePolicy, Constraints, Intrinsic Measurements 등 다양한 컴포넌트의 상호작용을 통해 수행됩니다. Owner를 통한 재측정 요청 LayoutNode의 구조적 변화(자식 추가, 제거, 이동 등)에 따라 크기나 위치 계산이 다시 필요할 때 Owner를 통해 재측정을 요청합니다.재측정 트리거: LayoutNode는 자식의 추가(attach), 제거(detach), 이동 등 구조 변경 시 requestRemeasure()를 통해 자신과 부모에 재측정을 요청합니다.요청 경로: 재..
Android 테스트는 앱의 정확성과 안정성을 자동으로 검증하는 과정입니다.테스트는 테스트 목적과 테스트 계층 두 가지 주요 유형이 있습니다. 테스트 목적기능 테스트: 앱이 정상적인 작동을 하는가? 성능 테스트: 빠르고 효율적으로 실행되나요? 접근성 테스트: 접근성 서비스와 잘 작동하나요? 호환성 테스트: 모든 기기와 API 수준에서 잘 작동하나요? 테스트 계층앱에서 얼마나 많은 구성요소가 함께 테스트되는지를 의미합니다.범위가 넓을수록 테스트는 복잡하고 느려지지만, 사용자 관점에 가까운 동작을 검증할 수 있습니다. Small Test: 단위 테스트는 메서드나 클래스처럼 앱의 아주 작은 부분만 검증합니다. Medium Test: 중간 규모 테스트는 두 개 이상의 단위를 통합하여 상호작용을 검증합니다. ..
Compose UI는 Compose Runtime의 기능을 활용하여 실제 UI 노드 트리(레이아웃 트리)를 생성하고 업데이트합니다. Compose UI의 특징Compose UI는 클라이언트 라이브러리입니다.Kotlin 멀티플랫폼 기반이며, Android/데스크톱 통합 계층을 포함합니다.Compose 런타임은 UI나 플랫폼(Android 등)에 대해 알지 못하며 독립적입니다.런타임은 노드 변경 작업을 클라이언트(UI)에 위임하며, Compose UI는 이를 위해 LayoutNode 노드타입을 사용합니다. 레이아웃 트리 구축 및 변경 사항 위임Composition과 Recomposition 과정은 Composable 함수를 실행하여 레이아웃 트리를 구축하고 업데이트합니다.Composable 함수는 실행 시..
변경 사항 적용은 Compose 런타임(Compose Runtime)의 마지막 핵심 단계로, 컴포저(Composer)가 기록한 변경 사항을 실제 UI 트리에 반영하고 구체화(materialize)하는 과정입니다. 이 작업은 Applier를 통해 수행됩니다. ApplierApplier는 Compose 런타임이 노드 트리에 대한 변경 사항을 구체화(materializing)하기 위해 의존하는 추상화 계층입니다.Composer가 기록한 변경 목록(Change List)을 실행하여 노드 트리를 실제로 업데이트슬롯 테이블의 Composition 데이터를 해석하고 구체적인 결과(UI 트리)를 생성Compose 런타임은 Applier의 구현체에 의존하지 않으며, 플랫폼별 클라이언트 라이브러리(예: Compose ..
Jetpack Compose는 런타임에 컴포저(Composer)를 통해 상태를 추적하는 슬롯 테이블(Slot Table)과 UI 변경 작업을 기록하는 변경 목록(Change List)을 분리하여 관리합니다. 슬롯 테이블 (Slot Table)슬롯 테이블은 Composition의 현재 상태를 메모리에 저장하고 추적하는 구조입니다.Composable 함수가 처음 실행될 때 초기 상태로 채워지며, 이후 Recomposition이 발생할 때 변경된 부분만 효율적으로 갱신됩니다. 주요 역할Composable 함수 호출의 위치, 매개변수, remember 값, CompositionLocal 등을 저장Composition의 현재 상태를 유지하고 추적 내부 구조구성 요소설명slots (Array)실제 compo..
Jetpack Compose 컴파일 파이프라인은 다음과 같습니다.Kotlin Source Code ↓Frontend (AST + PSI) ↓Compose Plugin 등록 (ComponentRegistrar) ↓IR 생성 (Intermediate Representation) ↓Compose IR Lowering (변환 단계) ↓JVM Backend (Bytecode 생성) ↓Compose Runtime (SlotTable, Recomposition 관리) Compose 컴파일러 플러그인은 Kotlin 컴파일러가 제공하는 ComponentRegistrar라는 메커니즘을 사용하여 자신을 Kotlin 컴파일러 파이프라인에 등록합니다. Com..
Jetpack Compose는 Compose Compiler, Compose Runtime, Compose UI 세 가지 핵심 요소로 구성됩니다.Compose Compiler & Runtime: Jetpack Compose의 핵심 요소이며, 다양한 클라이언트 라이브러리에서 사용될 수 있도록 설계됨.Compose UI: Runtime과 Compiler를 활용하는 클라이언트 중 하나로, UI 구성에 초점을 둠. Compose 컴파일러Jetpack Compose는 Kotlin 컴파일러 플러그인을 사용하여 Composable 함수 정보를 변환합니다.Compose Compiler는 Composable 함수에 Composer 매개변수를 강제로 주입하여 코드 생성을 수행합니다.프론트엔드(frontend) 단계에서 정..
Composable 함수의 의미Compose Runtime은 Composable 함수를 트리 구조의 노드로 인식하고 관리하기 때문에, 가장 기본이 되는 요소입니다.@Composablefun NamePlate(name:String) { // Our composable code}@Composable 어노테이션은 이 함수가 데이터를 UI 트리의 노드로 변환한다는 의도를 컴파일러에 전달합니다. @Composable 함수는 아래와 같은 형태로, 값을 반환하지 않고 Compose Runtime이 트리에 요소를 삽입하는 동작(action)을 수행합니다. 즉, 함수 실행의 결과는 트리에 변화를 주는 부수 효과(side effect)입니다.@Composable (Input) -> UnitComposable 함수는 ..
UI 상태를 어디로 호이스팅해야 하는지는 UI 상태가 UI 로직과 비즈니스 로직 중 어느 쪽에서 필요한지에 따라 달라집니다. UI 상태는 보통 UI 상태를 읽고 수정하는 모든 컴포저블들이 사용할 수 있도록 가장 가까운 공통된 상위 컴포저블로 호이스팅해야 합니다. 상태는 상태가 소비되는 위치에서 가장 가까운 곳에 유지해야 합니다. 상태 소유자로부터 소비자에게 변경 불가능한 상태 및 이벤트를 노출하여 상태를 수정합니다. UI 상태 및 UI 로직의 유형 UI 상태 UI 상태는 UI를 설명하는 속성입니다. UI 상태에는 두 가지 유형이 있습니다. 화면 UI 상태: 화면에 표시될 데이터를 포함하며, 앱의 데이터 계층과 연결됩니다. 예를 들어, 뉴스 앱의 NewsUiState에는 뉴스 기사 목록과 관련 정보가 포..

