study gomi

Jetpack Compose에서 생명 주기 처리 / LaunchedEffect, SideEffect, DisposalEffect / 설명, 비교 요약 본문

App/Android

Jetpack Compose에서 생명 주기 처리 / LaunchedEffect, SideEffect, DisposalEffect / 설명, 비교 요약

공부하곰 2024. 11. 22. 15:02
728x90
반응형

컴포저블에서의 효과(side-effects)를 처리하기 위해 사용하는 것들.


1. LaunchedEffect

: 컴포저블이 처음 Composition에 추가되었을 때 한 번 실행되는 코루틴. 주로 비동기 작업을 수행하거나 초기화 작업을 처리할 때 사용

 

1-1. 특징

  • 컴포저블의 Lifecycle과 연동됨.
  • 주어진 키(key)가 변경될 때마다 실행.
  • 내부에서 suspend 함수를 호출할 수 있다.
  • 컴포저블이 Recomposition될 때 다시 실행되지 않는다(키가 변경되지 않는 한).

1-2. 주요 시나리오

  • API 호출  초기 작업이 필요한 경우
  • Animation 등 suspend 함수 기반 작업
  • ViewModel 데이터 관찰 시작

1-3. 사용법

@Composable
fun MyScreen(data: String) {
    LaunchedEffect(data) {
        // 키가 변경될 때 실행
        println("Data is $data")
    }
}

 


2. SideEffect

: 컴포저블의 Recomposition이 발생할 때마다 실행되는 동작. 주로 Compose 외부 시스템과의 통신 또는 UI 업데이트를 처리할 때 사용

 

2-1. 특징

 

  • Recomposition마다 실행
  • MutableState의 값을 변경하는 등 Compose의 상태와 외부 상태를 동기화할 때 유용.
  • UI와 상호작용이 없는 작업에 적합.

2-2. 주요 시나리오

 

  • 로깅이나 디버깅 작업
  • Compose 상태를 외부 시스템이나 객체에 동기화
  • UI 변경과 관련 없는 작업

 

2-3. 사용법

@Composable
fun MyScreen(counter: Int) {
    SideEffect {
        println("Current counter value: $counter")
    }
}

 

 


3. DisposableEffect

: 컴포저블이 생성될 때 실행되며, 컴포저블이 Composition에서 제거될 때 정리 작업을 수행. 주로 리소스 해제, 리스너 제거 등 Lifecycle과 관련된 작업에 사용

 

3-1. 특징

 

  • onDispose 블록을 사용하여 정리(cleanup) 작업을 수행할 수 있다.
  • Compose의 Composition Lifecycle을 직접 다룰 때 유용.
  • DisposableEffect는 주어진 키(key)가 변경될 때마다 다시 실행됨.

3-2. 주요 시나리오

 

  • 리소스 해제 (e.g., BroadcastReceiver 해제, Listener 제거)
  • Composition Lifecycle을 기준으로 동작 관리
  • ViewModel 등 Compose 외부에서의 상태 변경 감지

3-3. 사용법

@Composable
fun MyScreen(listener: SomeListener) {
    DisposableEffect(listener) {
        listener.register() // 초기화 작업
        onDispose {
            listener.unregister() // 정리 작업
        }
    }
}

 

 


비교: 언제 어떤 걸 사용?


요약

 

  • LaunchedEffect
    • 초기화 작업이나 Suspend 함수 호출이 필요할 때.
    • 컴포저블이 처음 등장하거나 키가 변경될 때 실행.
  • SideEffect
    • 상태 동기화로깅 같은 부수 효과를 처리.
    • Recomposition마다 실행됨.
  • DisposableEffect
    • 리스너 등록/해제 같은 작업.
    • Lifecycle 이벤트와 관련된 동작을 처리.

 

728x90
반응형