Android에서 화면을 회전하면 기본적으로 Activity가 다시 만들어진다. 그래서 회전 처리는 단순히 가로/세로 레이아웃을 바꾸는 문제가 아니라, 사용자가 보던 상태를 저장하고 다시 복원하는 문제에 가깝다. 입력값, 스크롤 위치, 선택된 탭, 로딩 중인 데이터가 여기에 포함된다.
onConfigurationChanged를 쓰면 재생성을 피할 수 있지만, 모든 상황에서 좋은 답은 아니다. 대부분의 화면은 Activity 재생성을 자연스러운 흐름으로 받아들이고, 상태 복원 구조를 갖추는 편이 유지보수에 유리하다.

두 가지 처리 방식 비교
| 방식 | 어울리는 경우 | 주의할 점 |
|---|---|---|
| 기본 재생성 | 일반 화면, 폼, 목록, 상세 화면 | 상태 저장과 복원 경로가 필요하다. |
| onConfigurationChanged | 카메라, 영상, 특수 렌더링 화면 | 직접 리소스와 레이아웃 변화를 처리해야 한다. |
| 회전 고정 | 키오스크, 단일 방향 UX가 명확한 화면 | 문제 회피로 쓰면 태블릿과 폴더블 대응이 약해진다. |
기본 재생성을 기준으로 상태 복원하기
간단한 화면 상태는 Bundle에 저장하고, 화면보다 오래 살아야 하는 데이터는 ViewModel에 둔다. 둘을 구분하면 회전뿐 아니라 프로세스 종료 후 복원까지 더 안정적으로 다룰 수 있다.
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("query", binding.searchInput.text.toString())
outState.putInt("selectedTab", binding.tabs.selectedTabPosition)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val query = savedInstanceState?.getString("query").orEmpty()
val selectedTab = savedInstanceState?.getInt("selectedTab") ?: 0
render(query, selectedTab)
}
onConfigurationChanged는 우회로가 아니다
manifest에 configChanges를 추가하면 Activity 재생성을 막을 수 있지만, 그 대신 개발자가 리소스 변경, 레이아웃 갱신, 상태 업데이트를 직접 책임져야 한다. 특별한 이유가 없으면 기본 생명주기 안에서 해결하는 편이 안전하다.
점검 체크리스트
- 회전 후 입력 중이던 텍스트와 선택 상태가 유지되는지 확인한다.
- 목록 화면은 스크롤 위치가 지나치게 튀지 않는지 본다.
- API 재호출이 필요 이상으로 반복되지 않는지 로그로 확인한다.
- 가로 레이아웃이 따로 있다면 같은 상태 데이터를 공유하는지 테스트한다.
- 회전 고정은 UX 이유가 분명할 때만 선택한다.
읽을 때 확인할 점
화면 회전 처리는 어떤 콜백을 쓰느냐보다, 재생성돼도 화면이 무너지지 않는가가 핵심이다. Activity 생명주기를 자연스럽게 통과하도록 만들면 회전, 다크 모드 전환, 언어 변경 같은 다른 configuration change에도 같은 구조를 쓸 수 있다.
함께 보면 좋은 글
- 안드로이드 개발 기본 개념
- Android Fullscreen Mode 전환 방법
'Programming' 카테고리의 다른 글
| grep 명령어 사용법: 문자열 검색과 자주 쓰는 옵션 (0) | 2026.05.31 |
|---|---|
| ES6 모듈과 JavaScript 문법 변화 정리 (0) | 2026.05.31 |
| 안드로이드 개발 기본 개념: Activity, View, 생명주기 (0) | 2026.05.31 |
| Python setuptools: 패키지 설치와 배포 구조 이해하기 (0) | 2026.05.31 |
| Python super()와 MRO: 상속 호출 순서 이해하기 (0) | 2026.05.31 |








