오늘은 안드로이드 앱 개발에서 Compose의 상태 호이스팅(State Hoisting)에 대해 알아보겠습니다.
Stateful, Stateless
Compose에서 UI를 구축할 때 컴포저블은 상태 관리 방식에 따라 Stateful 과 Stateless로 나눌 수 있다.
Stateful
Stateful: Composable 함수에서 remember
(remember { mutableStateOf(...) }형태) 를 사용하여 객체를 저장하는 경우에, 해당 Composable 함수는 내부 상태를 가지게 되며, Stateful한 Composable로 분류된다. Stateful한 방식을 사용하면 함수가 객체를 메모리에 저장하여 여러 recomposition에서 상태를 효과적으로 보존할 수 있다. 내부 상태가 변경되면 UI를 업데이트한다.
Stateless
Stateless: Composable 함수에서 remember
(remember { mutableStateOf(...) }형태) 를 사용하지 않고 인수를 통해서 상태를 수신할 때 Stateless라고 불린다. Stateless는 내부 상태를 유지 하지 않고, 전달 받은 데이터에 전적으로 의존한다. 그리고 예측 가능하고 재사용하기 쉽다.
State Hoisting
Compose에서 상태호이스팅은 Composable을 Stateless로 만들기 위해 상태를 컴포저블의 호출자로 옮기는 것이다.
Jetpack Compose에서 상태 호이스팅을 하는 일반적 패턴은 상태 변수를 두 개의 매개변수로 바꾸는 것이다.
@Composable
fun MyStatefulTextField() {
var text by remember { mutableStateOf("") }
TextField(
value = text,
onValueChange = { newText -> text = newText }
)
} // Stateful Composable
MyStatefulTextField
Composable은 text 상태를 내부적으로 관리하므로 Stateful이다.
@Composable
fun MyStatelessTextField(
value: String,
onValueChange: (String) -> Unit
) {
TextField(
value = value,
onValueChange = onValueChange
)
}
@Composable
fun MyScreen() {
var text by remember { mutableStateOf("") }
MyStatelessTextField(
value = text,
onValueChange = { newText -> text = newText }
) // 상태호이스팅 적용
}
MyStatelessTextField
Composable은value
와onValueChange
를 인자로 받으므로Stateless
다MyScreen
Composable에서text
상태를 관리하고,MyStatelessTextField
에 필요한 데이터를 전달한다.
상태 호이스팅 장점
- 재사용성 향상: Stateless Composable은 다양한 context에서 재사용할 수 있다.
- 테스트 용이성: Stateless Composable은 입력에 따라 출력이 결정되므로 테스트하기 쉽다.
상태 호이스팅 단점
- 코드의 복잡성 증가: 상태를 상위 컴포저블로 옮기면서 상위 컴포저블의 코드가 더 길어지고 복잡해질 수 있다.
- 빈번한 UI 재구성으로 인한 객체 생성 비용 증가: 상태 변경이 잦은 경우, 콜백 함수 호출로 인해 UI가 불필요하게 자주 재구성되어 성능 저하를 유발할 수 있다.
'android' 카테고리의 다른 글
Android UiState (0) | 2025.03.25 |
---|---|
Android ViewModel (0) | 2025.03.17 |
Android XML과 Compose의 차이점? (0) | 2025.02.23 |
Android Dagger & Hilt (0) | 2025.02.17 |
Android DI (0) | 2025.02.09 |