Jetpack Compose를 스터디하면서 state에 따라 화면이 자동으로 갱신된다는 점을 정리했다. 이제는 기존 Activity의 생명주기에 따라 동작하는 기능을 Jetpack Compose에서 어떻게 구현할 수 있는지에 대해 정리해보려 한다. 기존의 onCreate, onStart, onResume 등의 메서드를 직접 override 하는 방식과는 조금 다른 Compose만의 접근 방식이 있어서 익혀두면 유용하다.
1. Lifecycle의 중요성.
앱을 만들다 보면 화면에 진입할 때 데이터를 로딩하거나, 백그라운드로 나가면 특정 리소스 해제가 필요하다. 이런 동작은 Activity의 생명주기에 맞춰 처리해야 앱이 안정적이고 성능도 좋아지기 때문에 Activity Lifecycle을 중요하다.
2. Jetpack Compose에서 Lifecycle을 다루는 방법
Jetpack Compose에서는 LifecycleOwner와 LifecycleEventObserver를 활용하거나, LaunchedEffect와 DisposableEffect 같은 Compose Side-effect APIs를 사용해서 lifecycle을 다룰 수 있다.
방법 1) LifecycleEventObserver 사용하기
@Composable
fun MyComposable() {
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_START -> {
// 화면이 시작될 때 실행할 코드
}
Lifecycle.Event.ON_STOP -> {
// 화면이 종료될 때 실행할 코드
}
else -> {}
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}
방법 2) Side-effect APIs 사용하기
- LaunchedEffect: Composable이 처음 composition 될 때 실행
- DisposableEffect: Lifecycle의 진입/종료 시점을 감지할 때 유용
@Composable
fun MyScreen() {
LaunchedEffect(Unit) {
// 화면이 보여질 때 실행 (composition 시점)
}
DisposableEffect(Unit) {
onDispose {
// 화면이 제거될 때 실행
}
}
}
3. Lifecycle 이벤트 정리
Lifecycle 이벤트 | 설명 | Compose에서의 활용 예시 |
---|---|---|
ON_CREATE |
액티비티가 처음 생성될 때 | LaunchedEffect(Unit) 로 초기 로딩 |
ON_START |
화면이 사용자에게 보이기 시작할 때 | 네트워크 요청, 애니메이션 시작 등 |
ON_RESUME |
사용자와 상호작용 가능한 상태 | 센서, 위치 정보 수신 시작 등 |
ON_PAUSE |
다른 액티비티에 의해 가려질 때 | 센서, 위치 수신 중단 |
ON_STOP |
화면이 완전히 보이지 않을 때 | 리소스 해제, 상태 저장 |
ON_DESTROY |
액티비티가 종료될 때 | Observer 제거, 정리 작업 수행 |
4. 마무리
Jetpack Compose는 선언형 UI 방식이라 기존 명령형 UI와는 많이 다르지만, 그렇다고 해서 lifecycle 관련 기능을 구현하지 못하는 건 아니다. LifecycleEventObserver나 Effect API 같은 Compose에 맞는 도구들을 잘 활용하면, 생명주기에 따라 동작하는 기능도 충분히 유연하게 만들 수 있다. 기존 방식과 다른 점들을 Compose 방식에 맞게 잘 정리해두면, 더 깔끔하고 안정적인 앱을 만들 수 있을 것 같다.
'Android > Jetpack Compose' 카테고리의 다른 글
[Jetpack Compose] 기존 UI방식과 다른 점? (0) | 2025.04.20 |
---|