— View 중심 사고에서 State 중심 사고로
Compose를 처음 보면 많은 Android 개발자들이 이렇게 느낍니다.
“XML 대신 Kotlin으로 UI 만드는 거네?”
하지만 실제로 Compose의 가장 큰 변화는 문법이 아닙니다.
진짜 변화는:
객체(View) 중심 사고
→
상태(State) 중심 사고
로의 이동입니다.
이 변화는 생각보다 훨씬 큽니다.
왜냐하면 Android 개발자들은 오랫동안:
- View 객체를 만들고
- 직접 수정하고
- 이벤트를 연결하고
- Lifecycle을 따라 상태를 관리하는 방식
에 익숙해져 있었기 때문입니다.
Compose는 이 흐름 자체를 바꾸려고 합니다.
기존 Android 개발 방식
전통적인 Android UI는 기본적으로:
“화면 객체(View)를 직접 조작”
하는 방식이었습니다.
예를 들어 로그인 버튼 활성화.
기존 View 방식
button.isEnabled =
idEditText.text.isNotBlank() &&
passwordEditText.text.isNotBlank()
우리는 자연스럽게:
Button 객체를 직접 수정
합니다.
즉 사고 흐름이:
현재 UI 객체 상태를 어떻게 변경할까?
입니다.
Compose의 사고 방식
Compose에서는 완전히 다르게 접근합니다.
@Composable
fun LoginScreen() {
var id by remember { mutableStateOf("") }
var pw by remember { mutableStateOf("") }
val enabled = id.isNotBlank() &&
pw.isNotBlank()
Column {
TextField(
value = id,
onValueChange = { id = it }
)
TextField(
value = pw,
onValueChange = { pw = it }
)
Button(
enabled = enabled,
onClick = {}
) {
Text("로그인")
}
}
}
여기서는:
button.enable()
같은 코드가 없습니다.
Compose에서는:
“현재 상태가 무엇인가?”
만 정의합니다.
가장 중요한 사고 변화
Compose를 배우며 가장 중요한 변화는 이것입니다.
기존 Android 사고
UI를 어떻게 조작할까?
Compose 사고
현재 상태를 어떻게 표현할까?
이 차이는 단순 문법 차이가 아닙니다.
Architecture 전체에 영향을 줍니다.
RecyclerView 사고 vs LazyColumn 사고
Android 개발자들이 가장 크게 체감하는 변화 중 하나입니다.
기존 RecyclerView 사고
우리는 오랫동안 이런 구조에 익숙했습니다.
RecyclerView
└ Adapter
└ ViewHolder
그리고 주요 고민은:
- View 재사용
- notifyDataSetChanged()
- partial update
- payload
- ViewHolder 최적화
였습니다.
즉:
리스트를 어떻게 효율적으로 갱신할까?
에 집중했습니다.
Compose 방식
Compose에서는:
LazyColumn {
items(users) { user ->
Text(user.name)
}
}
처럼 작성합니다.
여기서 핵심은:
“어떻게 갱신할까?”
가 아니라
“현재 데이터가 무엇인가?”
입니다.
사고 흐름 비교
기존 Android
데이터 변경
→ Adapter notify
→ View 갱신
Compose
State 변경
→ Recomposition
→ UI 재계산
Compose에서는:
UI 갱신을 직접 지시
하지 않습니다.
상태가 바뀌면 UI가 자동으로 다시 계산됩니다.
Fragment Navigation 사고 변화
이 부분도 매우 중요합니다.
기존 Android Navigation
우리는 오랫동안:
Activity
└ Fragment A
└ Fragment B
구조에 익숙했습니다.
그리고:
fragmentManager.beginTransaction()
중심으로 사고했습니다.
즉:
“화면 객체를 이동”
하는 개념입니다.
Compose Navigation 사고
Compose에서는:
현재 App State가 무엇인가?
관점으로 접근합니다.
예:
sealed class Screen {
object Home : Screen()
object Detail : Screen()
}
when(screen) {
is Screen.Home -> HomeScreen()
is Screen.Detail -> DetailScreen()
}
즉:
화면 이동
보다
현재 화면 상태 변화
에 가깝습니다.
화면 회전 대응 사고 변화
Android 개발자들이 오랫동안 고생한 부분입니다.
기존 Android
회전 시:
onSaveInstanceState()
를 많이 다뤘습니다.
Lifecycle 중심 사고였습니다.
Compose
Compose에서는:
rememberSaveable
같은 상태 보존 메커니즘을 사용합니다.
예:
var text by rememberSaveable {
mutableStateOf("")
}
즉 사고가:
Lifecycle 대응
에서
상태 보존 전략
으로 이동합니다.
비동기 처리 사고 변화
이 변화도 매우 큽니다.
기존 Android
기존에는:
- callback
- listener
- handler
- LiveData observer
중심이었습니다.
즉:
Event 처리
가 핵심이었습니다.
Compose
Compose에서는:
val uiState by
viewModel.uiState.collectAsState()
처럼:
상태 Stream을 관찰
합니다.
예:
when(uiState) {
is Loading -> LoadingUI()
is Success -> SuccessUI()
is Error -> ErrorUI()
}
즉:
비동기 이벤트 처리
보다
Reactive State Flow
가 중심이 됩니다.
Compose의 핵심은 UI가 아니다
많은 사람들이 Compose를:
새로운 UI Toolkit
으로만 생각합니다.
하지만 실제 핵심은:
Data Flow Architecture 변화
입니다.
기존 Android 사고 vs Compose 사고
| 기존 Android | Compose |
| View 조작 | State 선언 |
| notifyDataSetChanged | 자동 recomposition |
| Fragment 이동 | Screen state |
| callback 중심 | reactive stream 중심 |
| imperative UI | declarative UI |
| mutable object | immutable state 지향 |
| lifecycle callback | state-driven UI |
Android 전문가가 처음 헷갈리는 이유
Android 경험이 깊을수록 처음엔 Compose를 보며:
“이건 그냥 DSL UI 아닌가?”
처럼 느끼기 쉽습니다.
왜냐하면 처음엔:
- Text()
- Button()
- Column()
같은 문법만 보이기 때문입니다.
하지만 실제 핵심은:
UI = f(state)
라는 철학입니다.
즉:
“UI를 함수처럼 생각하기”
입니다.
Compose를 이해하는 가장 중요한 문장
Compose를 이해하는 가장 중요한 문장은 이것입니다.
현재 상태가 바뀌면
UI는 다시 계산된다.
Compose 개발은 결국:
상태 흐름을 설계하는 작업
에 가깝습니다.
실전에서 가장 추천하는 연습
Compose 학습에서 가장 중요한 건:
State 흐름 체감
입니다.
그래서 단순 Counter보다:
- 로그인 화면
- 검색 리스트
- 실시간 대시보드
- 채팅 UI
- 운전 점수 Dashboard
같은 예제가 훨씬 좋습니다.
예를 들어 운전 Dashboard는:
- GPS Stream
- 속도 변화
- 위험 이벤트
- 리스트
- Flow
- recomposition
- Lifecycle
- Hybrid UI
전부 경험할 수 있습니다.
마무리
Compose의 진짜 변화는:
XML → Kotlin
이 아닙니다.
실제로는:
View 중심 사고
→
State 중심 사고
로의 이동입니다.
그리고 이 변화는:
- UI 구조
- Architecture
- Data Flow
- Navigation
- 비동기 처리
- 상태 관리
전체를 바꿉니다.
그래서 Compose를 제대로 배우려면:
“Composable 문법”
보다
“상태 흐름을 어떻게 설계할까?”
를 먼저 고민해야 합니다.
다음 글에서는:
“Compose에서 반드시 이해해야 하는 핵심 개념들”
을 실제 코드와 함께 정리해보겠습니다.
'Android Programming' 카테고리의 다른 글
| 1편: Android Compose는 왜 등장했을까? (0) | 2026.06.10 |
|---|---|
| ViewModel에서 Factory 사용 여부 비교 (0) | 2025.03.25 |
| Modern Anroid Application의 UI 구조 이해 (0) | 2025.03.18 |
| Modern Anroid Application의 구조 이해 (1) | 2025.03.11 |
| Waydroid 설정하기 (2) | 2022.04.15 |
