LiveData를 에러 핸들링에 적용하는 방법은?
_____A: LiveData 자체는 단순히 상태 변화를 관찰하는 역할을 하므로, 에러 상태 역시 데이터의 한 종류로 관리하면 됩니다. 에러를 포함하는 상태 객체를 만들거나, 별도의 에러 전용 LiveData를 사용해 UI에서 관찰 및 처리할 수 있습니다.
Q: 에러 상태를 담기 위한 LiveData 설계 방법은?
A: 보통은 다음과 같이 응답 상태를 감싸는 클래스를 만듭니다.
```kotlin
sealed class Result
data class Success
data class Error(val exception: Throwable) : Result
object Loading : Result
}
```
이 클래스를 이용해 LiveData
Q: ViewModel에서 LiveData를 이용해 에러를 어떻게 처리하나요?
A: 실제 로직 수행 후 try-catch로 에러를 잡고, 실패 시 Result.Error 상태를 postValue하거나 setValue 해서 UI에 알립니다. 예:
```kotlin
private val _result = MutableLiveData
val result: LiveData
fun fetchUser() {
_result.value = Result.Loading
viewModelScope.launch {
try {
val user = repository.getUser()
_result.value = Result.Success(user)
} catch (e: Exception) {
}
}
}
```
Q: UI에서 LiveData를 어떻게 관찰하며 에러를 핸들링하나요?
A: Activity나 Fragment에서 observe()로 LiveData를 구독 후 when절, if문 등으로 상태를 분기합니다. 예:
```kotlin
viewModel.result.observe(viewLifecycleOwner) { result ->
when(result) {
is Result.Loading -> showLoading()
is Result.Success -> showData(result.data)
is Result.Error -> showError(result.exception.message)
}
}
```
Q: 별도의 에러 LiveData를 두는 것과 상태 객체를 이용하는 방식의 차이점은?
A: 별도 LiveData는 역할이 명확하지만 상태가 여러 개일 때 관리가 번거로울 수 있습니다. 상태 객체 방식은 하나의 LiveData로 모든 상태를 처리해 관리가 용이하고 상태 전이가 명확하지만, 상태 정의가 복잡해질 수 있습니다.
Q: 네트워크 통신 시 에러와 로딩 상태를 LiveData로 관리하는 팁은?
A: 네트워크 시도 전에 Loading 상태를 발행하고, 성공과 실패 모두 Result 타입으로 알리면 UI에서 일관된 상태 관리를 할 수 있습니다. 또한, SingleLiveEvent 같은 이벤트 처리를 위한 LiveData 확장도 함께 쓰면 알림성 에러 처리에 유리합니다.
---
요약: LiveData로 에러 핸들링하면 UI에 상태를 쉽게 전달할 수 있습니다. Result 같은 상태 래퍼 클래스로 성공, 실패, 로딩 상태를 표현하고 ViewModel에서 상태를 관리, UI는 observe하며 적절히 처리하는 방식이 가장 효과적입니다.
LiveData는 기본적으로 상태를 관찰하는 객체이기 때문에, 에러 정보도 별도의 상태로 관리하여 UI에 전달하는 것이 중요합니다.
1. 에러 상태를 위한 별도의 LiveData 정의하기 보통 데이터 로딩 성공 상태와 에러 상태를 구분해서 관리하기 위해 데이터 상태용 LiveData와 에러 상태용 LiveData를 별도로 만듭니다.
예를 들어: ```kotlin private val _data = MutableLiveData() val data: LiveData = _data private val _error = MutableLiveData
2. 네트워크 요청 등에서 에러 발생시 에러 LiveData 업데이트하기 ViewModel 내부에서 데이터를 로딩할 때, try-catch구문 또는 Result 타입 등을 이용하여 에러를 감지하고, 에러 메시지 또는 에러 객체를 에러 LiveData에 전달합니다.
```kotlin fun loadData() { viewModelScope.launch { try { val result = repository.getData() _data.value = result _error.value = null // 에러 해제 } catch (e: Exception) { _error.value = e.message ?: "Unknown error" } } } ```
3. UI에서 에러 LiveData 관찰하기 Fragment나 Activity에서는 error LiveData를 관찰하여 에러 메시지가 전달되면 에러 다이얼로그를 띄우거나 토스트를 보여주는 등의 사용자 피드백을 제공합니다.
```kotlin viewModel.error.observe(viewLifecycleOwner) { errorMessage -> errorMessage?.let { Toast.makeText(context, it, Toast.LENGTH_SHORT).show() } } ```
4. 에러 상태의 초기화 및 재시도 지원 에러 발생 후 사용자가 재시도할 수 있도록 에러 상태를 초기화하거나 재시도 함수를 제공해 줍니다.
```kotlin fun retry() { _error.value = null loadData() } ```
5. 단일 이벤트로 에러 처리하기 (Event Wrapper 적용) LiveData는 configuration 변화 시 같은 데이터가 다시 전달되는 문제가 있어 에러 메시지 같은 이벤트에 Event 클래스를 사용하는 경우가 많습니다.
```kotlin private val _errorEvent = MutableLiveData
--- 요약 - 데이터 상태와 에러 상태를 별도의 LiveData로 관리한다.
- 네트워크 호출 등에서 에러가 발생하면 에러 LiveData를 업데이트한다.
- UI는 에러 LiveData를 관찰해 사용자에게 에러를 알린다. - 필요하면 에러 이벤트를 감싸는 Event 클래스를 사용해 중복 처리 문제를 예방한다.
- 재시도 UI와 로직을 추가해 에러 상황을 개선한다.
이러한 패턴을 통해 LiveData 기반의 에러 핸들링을 자연스럽고 확장성 있게 구현할 수 있습니다.
작성자:
정유민 [비회원]
| 작성일자: 1년 전
2025-05-25 12:41:14
조회수: 160 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 160 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.