오늘은 안드로이드 앱 개발에서 UI상태를 효율적으로 관리하는 핵심 아키텍처 컴포넌트 ViewModel에 대해 알아보겠습니다.
ViewModel
ViewModel은 Android에서 UI 관련 데이터를 관리하는 아키텍처 컴포넌트이다.
ViewModel을 사용해야 하는 이유
- 구성 변경에도 데이터 유지: 화면 회전 등의 변경이 발생해도 기존 데이터를 유지할 수 있다.
- UI와 로직 분리: UI 관련 데이터를 ViewModel에서 관리하여 Composable이 깔끔해진다.
- 비동기 작업과 연동 용이: ViewModelScope를 활용하여 네트워크 요청이나 데이터베이스 작업을 쉽게 관리할 수 있다.
ViewModel 사용 방법
기본적인 ViewModel
을 정의
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
class MyViewModel : ViewModel() {
private val _count = MutableStateFlow(0) // 상태를 유지하는 변수
val count: StateFlow<Int> = _count
fun increment() {
_count.value += 1
}
}
Jetpack Composable
에서는 ViewModel()
함수를 사용하여 ViewModel 적용 가능
@Composable
fun CounterScreen(viewModel: MyViewModel = viewModel()) {
val count by viewModel.count.collectAsState()
Column {
Text("카운트: $count")
Button(onClick = { viewModel.increment() }) {
Text("증가")
}
}
}
ViewModelScope
ViewModelScope는 ViewModel의 생명주기를 자동으로 관리해주는 코루틴 스코프이다.
ViewModelScope 사용 이유
- 자동 관리: ViewModelScope에서 실행되는 모든 코루틴은 ViewModel의 생명주기와 연결되어 있기 때문에, ViewModel이 파괴될 때 자동으로 취소된다.
- 비동기 작업 처리: 네트워크 요청, 데이터베이스 작업 등 비동기 작업을 쉽게 처리할 수 있다.
- UI와 로직 분리: UI와 관련된 데이터를 비동기 작업에서 처리하는 로직을 ViewModel 내에서 처리함으로써 UI 코드와 로직을 분리할 수 있다.
class MyViewModel : ViewModel() {
private val repository = DataRepository()
// 데이터를 비동기적으로 가져오는 함수
fun fetchData() {
// viewModelScope 내에서 launch를 사용하여 비동기 작업 실행
viewModelScope.launch(Dispatchers.IO) {
try {
val data = repository.getData() // 네트워크 요청 혹은 DB 작업
// UI에 전달할 수 있도록 메인 스레드로 전환
_dataState.value = data
} catch (e: Exception) {
// 오류 처리
_errorState.value = e.message
}
}
}
}
'android' 카테고리의 다른 글
Android Interceptor (0) | 2025.04.01 |
---|---|
Android UiState (0) | 2025.03.25 |
Android State Hoisting(상태 호이스팅) (0) | 2025.03.10 |
Android XML과 Compose의 차이점? (0) | 2025.02.23 |
Android Dagger & Hilt (0) | 2025.02.17 |