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()를 통해 자신과 부모에 재측정을 요청합니다.요청 경로: 재..
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에는 뉴스 기사 목록과 관련 정보가 포..
앱의 상태(State)는 시간이 지나며 변하는 값으로, 데이터베이스부터 UI 요소까지 포함됩니다. 상태 및 컴포지션 Compose에서는 UI를 업데이트하려면 새 인수로 컴포저블을 다시 호출해야 합니다. 상태가 변경될 때마다 재구성이 실행되며, TextField 같은 요소도 자동으로 업데이트되지 않습니다. 따라서 새 상태를 명시적으로 전달해야 합니다. 컴포저블의 상태 컴포저블 함수는 remember를 사용해 객체를 메모리에 저장할 수 있습니다.remember는 초기 컴포지션 시 값을 저장하고, 이후 리컴포지션에서도 해당 값을 유지합니다.mutable / immutable 객체 모두 저장할 수 있으며, 컴포저블이 컴포지션에서 제거되면 저장된 객체도 삭제됩니다. 또한, mutableStateOf는 Co..
