Android 구성 변경(Configuration Changes)에 대하여

dev_yo·2025년 11월 26일
post-thumbnail

안녕하세요! 👋
오늘은 Android에서 구성 변경시에 어떤 전략을 사용하면 좋을지에 대해서 가볍게 정리해보려 합니다!

1. 구성 변경이란? 🤔

화면 회전, 언어 변경, 다크/라이트모드 전환, 글꼴 크기 또는 두께 조정과 같은 앱 설정에 변경이 되는것을 말하며, 기본적으로 구성 변경이 일어날 경우 Activity 를 재시작하게 됩니다.


2. 구성 변경 대응 방법

onSaveInstanceState / onRestoreInstanceState

onSaveInstanceState 를 통해 Activity 재생성 전에 상태를 저장하고 onRestoreInstanceState 에서 해당 상태를 복원 할 수 있습니다.

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("input", editText.text.toString())
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    editText.setText(savedInstanceState.getString("input"))
}

ViewModel을 활용한 데이터 보존

ViewModel 객체는 Activity 의 생명 주기보더 길게 설계되었으므로, 구성 변경이 발생했을 때 데이터를 보존하고 다시 복원하는 데 이상적입니다.

Compose의 rememberSaveable 사용

rememberSavable 은 구성 변경 시에도 상태를 유지하여 remember 보다 더 넓은 범위에서 상태를 저장하고 복원합니다.Bundle 에 저장 할 수 있는 값에 한하여 자동으로 저장하고 복원하며 그렇지 못한 값의 경우에는 별도의 Saver 를 구현하여야 합니다.

@Composable
fun Foo() {
    var count by remember { mutableIntStateOf(0) }
    var savableCount by rememberSaveable { mutableIntStateOf(0) }

    LaunchedEffect(Unit) {
        while (true) {
            delay(1.seconds)
            count++
            savableCount++
        }
    }

    Text(text = count.toString()) // 화면 회전시 초기화
    Text(text = savableCount.toString()) // 화면 회전시 유지됨
}

Manifest의 configChanges로 직접 처리

구성 변경 중에 리소스를 업데이트 할 필요가 없고, Activity 재시작을 피하고 싶다면, AndroidManifest 에서 Activity 가 처리할 구성 변경 사항을 android:configChanges 속성을 사용하여 선언할 수 있습니다. 선언 한 후에 onConfigurationChanged() 를 재정의하여 해당 변경 사항이 발생했을 때 수동으로 관리할 수 있습니다.

android:configChanges="orientation|keyboardHidden" // 화면 회전 , 키보드 접근성 변경
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // 가로로 회전했음
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        // 세로로 회전했음
    }
}

android:configChanges 의 사용은 구성 변경의 책임을 Activity 로 넘기는 동작입니다. 주로 사용하는 경우는 게임 , 스트리밍 서비스와 같이 화면 재생성시에 큰 오버헤드가 발생하는 경우 구성 변경을 막고 필요한 부분만 수동으로 업데이트 할때 사용하는 전략입니다!


3. 마치며

구성 변경은 안드로이드 앱 개발에서 자주 마주치지만, 매번 헷갈리거나 놓치기 쉬운 부분인것 같습니다! 저도 정리하면서 한번 더 숙지하게 되었는데요 상황에 따라 알맞은 전략을 사용하면 사용자 경험을 안정적으로 유지 할 수 있을것 같다고 생각했습니다. 😇

오늘 포스팅은 여기서 마치겠습니다.
이글이 여러분에게 도움이 되었으면 좋겠습니다.
오늘도 즐코하세요 🙇‍♂️

📚 Reference
Android Manifest Interview <저자: 엄재웅(skydoves)>

Android Developers (구성 변경 처리)

Android Developers (activity)

profile
어제보다 발전한 오늘이 되고픈 🧑🏻‍💻

0개의 댓글