LiveData에서 요청 실패 시 대처하는 방법은?
_____A1: LiveData 자체는 상태 관리 역할을 하므로, 요청 실패를 처리하려면 데이터와 함께 상태 정보를 포함하는 별도의 클래스(예: Resource, Result)를 사용해 실패 상태를 전달하고, UI에서는 이 상태를 감지해 적절히 대응합니다.
---
Q2: 실패 상태를 나타내는 가장 일반적인 방법은 무엇인가요?
A2: 보통 다음과 같이 세 가지 상태를 포함하는 제네릭 클래스(Resource
- Loading: 요청 진행 중
- Success: 요청 성공, 데이터 포함
- Error: 요청 실패, 에러 메시지 또는 예외 포함
이 클래스를 LiveData의 제네릭 타입으로 사용해 상태 변화를 관찰합니다.
---
Q3: Resource 클래스를 사용한 실패 처리 예시는?
A3:
```kotlin
sealed class Resource
val data: T? = null,
val message: String? = null
){
class Success
class Loading
class Error
}
// ViewModel에서
private val _data = MutableLiveData
val data: LiveData
fun fetchData() {
_data.value = Resource.Loading()
repository.getData(
onError = { error -> _data.value = Resource.Error(error.message ?: "Error") }
)
}
```
---
Q4: UI에서는 실패 상태를 어떻게 반영해야 하나요?
A4: 액티비티나 프래그먼트에서 LiveData를 관찰하며 Resource의 상태를 확인합니다.
```kotlin
viewModel.data.observe(viewLifecycleOwner) { resource ->
when(resource) {
is Resource.Loading -> showLoading()
is Resource.Success -> showData(resource.data)
is Resource.Error -> showError(resource.message)
}
}
```
---
Q5: LiveData 외에 다른 대응 방법이 있나요?
A5: 네, `LiveData` 대신 `StateFlow`나 `SharedFlow` 같은 코틀린 코루틴 기반 플로우를 사용해 상태를 관리하는 방법도 있습니다. 이 경우에도 실패 상태를 포함한 상태 모델을 정의해 처리하는 것이 일반적입니다.
---
요약:
- LiveData는 상태를 직접 제공하지 않으므로 상태를 표현하는 클래스를 만들어 관리
- 요청 실패 시 에러 상태를 포함해 LiveData로 전달
- UI는 상태별로 적절한 처리를 수행(로딩, 성공, 실패 화면 변경 등)
- 필요에 따라 StateFlow 같은 대안을 고려할 수도 있음
이 방식으로 LiveData를 활용하면 요청 실패 상황을 효과적으로 처리할 수 있습니다.
LiveData 자체는 단순히 데이터를 관찰하고 변경 사항을 통지하는 기능만 제공하기 때문에, 실패 상황에 대한 처리는 보통 다음과 같은 패턴이나 추가적인 설계를 통해 이뤄집니다.
1. 상태를 표현하는 Wrapper 객체 사용하기 단순히 데이터를 저장하는 LiveData 대신, 요청의 상태(로딩, 성공, 실패 등)를 포함하는 래퍼 클래스(State wrapper)를 만들어서 관리합니다.
예를 들어 `Resource
```kotlin sealed class Resource
2. ViewModel에서 에러 관리하기 실패 시 예외 처리를 ViewModel에서 수행하고, 에러 메시지나 상태를 LiveData로 노출합니다.
예를 들어 다음과 같이 구성할 수 있습니다: ```kotlin private val _result = MutableLiveData
3. 단일 이벤트 처리 (Event Wrapper) 실패 이벤트를 UI에서 한 번만 소비하게 하기 위해 SingleLiveEvent 혹은 Event 래퍼 클래스를 사용하기도 합니다.
LiveData는 상태를 여러 번 발행하기 때문에, 에러 메시지가 중복 노출되는 문제를 방지하려면 이런 이벤트 래퍼를 활용합니다.
4. UI에서 실패 상태 대응 UI(Activity/Fragment)에서는 실패 상태가 들어오면 다음과 같이 처리할 수 있습니다.
- 토스트 혹은 스낵바로 에러 메시지 보여주기 - 에러 레이아웃 (재시도 버튼 포함) 노출 - 로딩 상태 UI 숨기기 예를 들어: ```kotlin viewModel.result.observe(this) { resource -> when(resource) { is Resource.Loading -> showLoading() is Resource.Success -> showData(resource.data) is Resource.Error -> { hideLoading() showError(resource.throwable.message) } } } ```
5. 추가적으로 고려할 사항 - 네트워크 재시도 정책: 실패 시 재시도 로직을 ViewModel 또는 Repository 레이어에 추가할 수 있습니다.
- 스레드 처리: 비동기 호출시 스레드 전환 잘 관리해야 하며, 실패 시 메인 스레드에서 상태 전파해야 UI에서 안전하게 처리가능합니다.
- 에러 타입 구분: 네트워크 실패, 데이터 파싱 실패, 서버 에러 등 에러 종류에 따른 구분 및 별도 처리도 필요할 수 있습니다.
--- 요약 - 네트워크 요청 실패 상황을 LiveData로 표현하려면 데이터를 감싼 상태 객체(Resource, Result 등)를 사용해 `Loading`/`Success`/`Error` 상태를 전달한다.
- ViewModel에서 실패 시 적절한 상태를 LiveData에 반영해 UI에 알린다. - UI에서는 LiveData 상태를 관찰해 실패 시 사용자에게 에러 메시지를 보여주거나 재시도 UI를 제공한다.
- 한번만 처리해야 하는 실패 이벤트는 이벤트 래퍼 클래스를 이용해 중복 처리를 막는다.
이 방식들을 조합해 사용하면 LiveData를 이용한 네트워크 요청 실패 처리와 UI 대응이 효율적이고 명확해집니다.
작성자:
최윤하 [비회원]
| 작성일자: 1년 전
2025-05-25 12:40:49
조회수: 179 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 179 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.