Compose의_부수_효과(Side_Effects) - boostcampwm-2024/and04-Nature-Album GitHub Wiki
Composable 내부에서 부수 효과 처리하기 위한 API의 용도
- 부수 효과는 UI 상태 외적인 작업을 의미하며, Composable 내에서는
LaunchedEffect
,rememberUpdatedState
,DisposableEffect
등의 API로 처리할 수 있다. - 안드로이드 공식 문서를 참고하자.
Android Developers Copmpose의 부수 효과 | Jetpack Compose | Android Developers
- 아래는 공식 문서 중 일부를 한국어로 요약 정리한 것이다.
부수 효과(Side Effects)란?
Jetpack Compose에서 부수 효과(Side-effects)는 Composable 함수가 아닌 앱의 상태에 영향을 주는 변화를 뜻한다. Composable은 불규칙한 재구성(recomposition) 때문에 부수 효과를 최소화하는 것이 좋으며, 가능한 한 UI와 무관한 상태 변화를 지양하는 것이 이상적이다. 하지만 때로는 일회성 작업(예: 스낵바 표시, 특정 조건에서 화면 이동)과 같은 부수 효과가 필요할 수 있다. 이러한 경우에는 Compose의 생명 주기에 따라 실행되는 효과 API를 사용하는 것이 좋다.
주요 용어: 효과와 상태 관리의 관계
Compose에서는 부수 효과가 실행될 때 UI 외적 동작이 필요한 경우 효과 API를 사용하여 예측 가능한 방식으로 부수 효과를 처리할 수 있다. 효과는 일반적으로 UI를 생성하지 않고, Composition이 완료된 후 상태를 변화시키는 함수를 의미한다.
유의점: Compose의 비동기 UI 처리를 위해 코루틴을 사용하며, LaunchedEffect와 같은 API는 효과를 안전하고 효율적으로 관리하기 위해 코루틴을 활용한다.
Jetpack Compose의 주요 부수 효과(Side-effect) API 요약
1. LaunchedEffect: Composable에서 일시적 작업 수행
LaunchedEffect
는 Composable의 생명주기에 맞춰 일시적(suspend) 작업을 수행하는 데 사용한다. Composition에 진입할 때 코루틴이 시작되며, Composition에서 벗어나면 해당 코루틴이 취소된다. 예를 들어, 알파 값을 주기적으로 변환하는 애니메이션에서 사용할 수 있다.
2. rememberCoroutineScope: Composable 외부에서 코루틴 시작
rememberCoroutineScope
는 Composition에 따라 자동 취소되는 코루틴 스코프를 제공하여, Composable 외부에서 코루틴을 시작할 때 유용하다. 예를 들어, 버튼 클릭 시 스낵바를 보여주는 작업에 사용할 수 있다.
3. rememberUpdatedState: 효과 재시작 없이 값 업데이트
rememberUpdatedState
는 효과가 재시작되지 않고 최신 값을 유지하도록 하는 기능을 제공한다. 예를 들어, LandingScreen
에서 일정 시간이 지난 후 화면 전환 작업을 수행할 때 사용할 수 있다.
4. DisposableEffect: 정리 작업이 필요한 효과
DisposableEffect
는 정리 작업(onDispose)을 필요로 하는 경우 사용한다. 예를 들어, LifecycleObserver
를 추가하고 제거할 때 사용할 수 있다.
5. SideEffect: Compose 상태를 비Compose 코드에 반영
SideEffect
는 Compose 상태를 외부 객체에 반영할 때 사용한다. 예를 들어, Firebase Analytics의 사용자 속성을 업데이트하는 경우에 사용할 수 있다.
6. produceState: 비Compose 상태를 Compose 상태로 변환
produceState
는 외부 데이터 소스의 상태를 Compose 상태로 변환할 때 사용된다. 예를 들어, 네트워크에서 이미지를 로드하는 작업에 활용할 수 있다.
7. derivedStateOf: 불필요한 재구성 방지
derivedStateOf
는 자주 변경되는 상태로 인한 불필요한 재구성을 방지한다. 예를 들어, 리스트 스크롤 위치를 기반으로 특정 조건에 맞게 버튼을 표시할 수 있다.
8. snapshotFlow: Compose 상태를 Flow로 변환
snapshotFlow
는 Compose의 State
를 Flow로 변환할 때 사용된다. 예를 들어, 스크롤 위치 변경을 감지해 애널리틱스에 기록하는 작업에 활용할 수 있다.