[Jetpack Compose] DisposableEffect 에 대해 알아보자

오규성·2025년 11월 11일

Jetpack Compose 기초

목록 보기
12/13

이번 글에서 알아 볼 기능은 DisposableEffect 이다.

DisposableEffect 란?

첫 Composition 이 완료된 후 내부 Scope 를 실행하며, Composition leave 시에 맞춰 종료 Lambda 를 제공해주는 Effect.

key 를 제공하기에 key 의 변화에 따라 내부 Scope 가 재실행되며, CoroutineScope 가 아니기에 따로 CoroutineScope 를 만들지 않는 이상, 내부에서 Suspend Function 을 호출할 수 없다.

다른 Effect 들과 마찬가지로 NonRestartableComposable 로 구현되어있어 Composable 이 재시작하지 않는다.

class MainActivity() : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        enableEdgeToEdge()
        setContent {
            DisposableEffect(true) {
                Timber.d("컴포지션 완료 후 실행시킬 코드를 이곳에 작성해주세요")

                onDispose { Timber.d("컴포지션이 종료될 때 실행시킬 코드를 이곳에 작성해주세요") }
            }
        }
    }
}

사용처

주로 Composable 생명 주기에 맞춰 특정 객체에 대한 참조를 해제하여 메모리 누수가 발생하지 않게 할 때 사용한다.

@Composable
fun MyComposableWithLifecycleObserver() {

    val lifecycleOwner = LocalLifecycleOwner.current

    DisposableEffect(lifecycleOwner) {        
        val observer = LifecycleEventObserver { _, event ->
            when (event) {
                Lifecycle.Event.ON_START -> Timber.d("Lifecycle: ON_START")
                Lifecycle.Event.ON_RESUME -> Timber.d("Lifecycle: ON_RESUME")
                Lifecycle.Event.ON_PAUSE -> Timber.d("Lifecycle: ON_PAUSE")
                Lifecycle.Event.ON_STOP -> Timber.d("Lifecycle: ON_STOP")
                else -> {}
            }
        }
        
        lifecycleOwner.lifecycle.addObserver(observer)

        //    이것이 없으면 심각한 메모리 누수가 발생
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
}
profile
안드로이드 개발자 Gyu 의 개발 블로그 !

0개의 댓글