본문 바로가기
개발/Compose

(Compose) Lifecycle - Composition의 탄생부터 소멸까지

by DinoDev 2025. 8. 8.
728x90
반응형

Jetpack Compose를 사용하다 보면 우리는 상태가 바뀌면 UI가 알아서 업데이트된다는 마법을 경험합니다. 이 마법의 비밀은 Compose가 컴포저블의 생명주기(Lifecycle)를 어떻게 관리하는지에 숨어 있습니다.

오늘은 컴포저블이 컴포지션(Composition)에 들어와서 사라지기까지, 그 여정을 함께 따라가 보겠습니다. 이 글을 이해하면 왜 remember를 써야 하고, 언제 LaunchedEffect를 사용해야 하는지 명확한 그림을 그릴 수 있게 될 것입니다.

Composition?

Composition은 Compose가 컴포저블 함수들을 실행하여 UI를 설명하는 트리 구조를 만드는 과정입니다. 이 트리는 UI의 '설계도'와 같습니다. 이 설계도가 만들어지고, 변경되고, 사라지는 것이 바로 컴포저블의 생명주기입니다.

Composable의 생명주기

컴포저블의 생명주기는 컴포지션 안에서 세 가지 주요 이벤트를 겪습니다.

  • 컴포지션에 진입 (Entering the Composition)
    • 언제? Compose가 컴포저블 함수를 처음 호출하여 UI 설계도에 추가할 때입니다.
    • 무슨 일이? 해당 컴포저블과 그 자식들이 처음으로 화면에 그려지기 위한 모든 단계를 거칩니다. (Composition -> Layout -> Drawing)
    • 핵심: 이 시점에 초기 데이터를 불러오거나 애니메이션을 시작하는 등의 '일회성' 작업을 수행할 수 있습니다.
  • 재구성 (Recomposition)
    • 언제? 컴포저블이 관찰하는 State가 변경되었을 때입니다.
    • 무슨 일이? Compose는 변경된 State를 사용하는 컴포저블만 다시 호출하여 UI 설계도를 업데이트합니다. 이때 Compose는 똑똑하게 변경이 필요한 부분만 다시 그리므로 매우 효율적입니다. 재구성은 매우 빈번하게, 심지어 애니메이션의 매 프레임마다 발생할 수 있습니다.
    • 핵심: 컴포저블 함수는 재구성을 염두에 두고 항상 멱등성(idempotent)을 가지도록, 즉 여러 번 호출되어도 부작용(Side-effect) 없이 동일한 결과를 내도록 작성해야 합니다.
  • 컴포지션에서 제거 (Leaving the Composition)
    • 언제? 더 이상 UI 설계도에 해당 컴포저블이 포함되지 않을 때입니다. if 문의 조건이 false가 되거나 다른 화면으로 이동하는 경우가 해당됩니다.
    • 무슨 일이? 컴포저블은 폐기(disposed)되며, 관련된 모든 리소스가 정리됩니다.
    • 핵심: 이 시점에 사용 중이던 리스너를 해제하거나 관찰을 중단하는 등, 메모리 누수를 방지하기 위한 '뒷정리' 작업을 수행해야 합니다.

생명주기에 맞게 동작하는 코드 작성하기

그렇다면 이 생명주기 이벤트에 맞춰 어떻게 코드를 실행할 수 있을까요?

remember

remember는 재구성이 일어나도 값을 잃어버리지 않도록 메모리(기억)를 제공하는 마법 같은 함수입니다. remember가 없다면 재구성 시 모든 변수가 초기화되어 상태를 저장할 수 없습니다.

// remember가 없다면, 재구성될 때마다 count는 0으로 초기화됩니다.
var count by remember { mutableIntStateOf(0) }

Side-Effect

컴포저블의 생명주기 이벤트 시점에 특정 작업을 실행하려면 Side-Effect 핸들러를 사용해야 합니다.

LaunchedEffect

LaunchedEffect는 key가 변경되지 않는 한 컴포지션에 진입할 때 딱 한 번만 실행됩니다. 데이터를 불러오거나, 초기 설정을 하기에 완벽합니다.

LaunchedEffect(Unit) { // key로 Unit을 주면 한 번만 실행됨
    viewModel.loadData()
}

DisposableEffect

DisposableEffect는 컴포지션에서 제거될 때 onDispose 블록이 호출되어 뒷정리를 합니다.

DisposableEffect(Unit) {
    // ... 리스너 등록 등 자원을 사용하는 작업 ...
    onDispose {
        // ... 리스너 해제 등 뒷정리 작업 ...
    }
}

마치며

Compose의 생명주기는 전통적인 안드로이드 생명주기보다 훨씬 단순하고 예측 가능합니다. 단순하게 진입, 재구성, 제거 라는 3가지 이벤트를 기억하면 됩니다.

그리고 remember를 통해 재구성에도 살아남는 상태를 만들고, LaunchedEffect와 DisposableEffect 같은 핸들러를 통해 각 생명주기 시점에 필요한 작업을 안전하게 실행하는 것. 이것이 바로 Compose 생명주기를 이해하고 활용하는 핵심입니다.

 


블로그 글에 대해 궁금한 점이 있다면 아래 카카오톡 오픈채팅에 들어와서 질문해주세요

 

Android Kotlin Compose QnA

 

open.kakao.com

 

728x90
반응형

'개발 > Compose' 카테고리의 다른 글

(Compose) Compose phase - 어떻게 화면을 그릴까?  (1) 2025.08.18
(Compose) Compose Side-Effect  (2) 2025.08.17
(Compose) Stateful vs Stateless  (5) 2025.08.07
(Compose) Compose UI Test  (4) 2025.08.05
(Compose) LazyColumn  (3) 2025.08.05