안드로이드에서 XML을 통해 Acivitity, Fragment, View 등 UI를 구성할 때 생명주기(Lifecycle)을 고려하며 설계 및 구현을 하였고, 다른 개발자 분들도 동일할 것이다. 이와 동일하게 Compose도 생명주기를 가지고 있다.
Compose는 @Composable 애노테이션을 이용하여 구성가능한 함수(Composable Function)를 만들 수 있다. 이 함수가 생명주기를 가지고 있으며 어떻게 관리해야 할지 고민이 필요한 부분이다.
컴포저블(Composable)의 생명주기
Jetpack Compose 에서 구성가능한 함수를 실행 할 때 빌드한 UI를 설명하는 녀석을 컴포지션(Composition)이라 한다. 생명주기의 각 상태에 대한 설명을 간단히 정리하고 넘어간다.
컴포저블의 생명주기는 총 3단계로 이루어져 있다.
- Init Composition : 처음 컴포저블을 실행하여 컴포지션을 생성한 단계
- Recomposition : 데이터가 변경될 때 컴포지션을 업데이트하기 위해 컴포저블을 다시 실행하는 것
- Decomposition : 컴포지션이 파괴될 때
처음 컴포저블을 실행하면 컴포지션이 생성된다. 이렇게 생성된 컴포지션은 UI의 구성 데이터가 업데이트 된 경우 리컴포지션(Recomposition)이 된다. 즉, UI 업데이트를 위해 컴포저블이 재실행 되는 것이다.
아래 코드에서 title 변수에 값이 전달되면 리컴포지션이 이뤄나고, Text 구성가능한 함수(Composable Funtion)은 새롭게 UI에 그려지게 된다.
@Composable
fun TitleText(title: String) {
Text(text = title)
}
리컴포지션은 위와 같은 간단한 예시처럼 동작하기도 하지만, 일반적으로 State<T> 객체를 사용하고, 해당 객체가 변경되면 트리거된다. 만약 UI를 구성하는 데이터가 업데이트가 되지 않는 경우 한번도 실행되지 않을 수 있다. 그 후 컴포저블을 종료하는 디컴포지션(Decomposition) 단계를 거치게 된다.
리컴포지션을 위한 상태
컴포즈가 리컴포지션을 추적하고 트리거하려면 상태가 변경된 시점을 알아야 한다. 컴포즈에게 해당 객체의 상태를 추적해야 한다고 알리는 방법은 추적해야 하는 객체의 유형이 State 또는 MutableState여야 한다. State 유형은 변경할 수 없으며 읽기만 가능하고. MutableState 유형은 변경 가능하며 읽기 및 쓰기 모두 가능하다.
리컴포지션 중에 값을 유지하고 재사용하도록 Compose에 지시하려면 remember API를 사용하여 해당 객체를 선언해야 한다.
var trackedValue by remember { mutableStateOf(0) }
위 변수가 변경되면 콤포즈는 리컴포지션을 위해 이 값을 읽는 모든 구성 가능한 함수(Composable function)를 예약한다.
구성 변경에 따른 상태 유지
Compose는 리컴포지션 중에 수익 상태를 기억하지만 구성 변경 중에는 이 상태를 유지하지 않는다. 여기서 구성 변경 상태란 예를 들어 화면이 회전하거나 해서 다시 그려지는 경우, 또는 사용자가 시스템의 언어를 변경을 통해 시스템 전체의 구성이 변경되어 어플리케이션의 레이아웃 등이 재 구성되어야 할 필요가 있는 상황이다. 만약 컴포즈가 구성 변경 중에 상태를 유지하려면 rememberSaveable을 사용한다.
Android OS에서 활동을 소멸하고 다시 만드는 경우 rememberSaveable 함수를 사용하여 필요한 값을 저장해야 한다. 기존의 remember API는 오직 리컴포지션 중 값의 상태를 유지할 뿐이다. rememberSaveable을 사용하여 리컴포지션 및 구성 변경 중에 값을 저장해야 한다.
- remember : 리컴포지션 중 값의 상태 유지
- rememberSaveable : 리컴포지션, 구성 변경 중 값의 상태 유지
생명주기는 컴포즈의 상태(State)와 밀접한 관련이 있기에 잘 정리하고 이해해두면, 상태에 대해 학습할 때 편의할 것 같아 미리 정리를 하였다.
참조
'Android > Compose' 카테고리의 다른 글
[Compose] Navigation 정리 및 적용하기 (0) | 2022.12.01 |
---|