LiveData의 오류 처리 방법은?
_____A: LiveData 자체는 단순히 데이터 관찰 및 변경 통지 역할을 하므로, 별도의 내장 오류 처리 메커니즘은 없습니다. 오류 처리는 주로 다음과 같은 방법으로 구현합니다.
---
1. 데이터를 래핑하는 방법
- Resource 클래스 사용
데이터 상태를 나타내는 클래스를 만들어 데이터와 상태(성공, 로딩, 오류)를 함께 담습니다.
```kotlin
sealed class Resource
val data: T? = null,
val message: String? = null
){
class Success
class Loading
class Error
}
```
- ViewModel에서 데이터를 `Resource` 클래스로 감싸서 LiveData에 전달하면, UI에서는 상태에 따라 적절히 처리(에러 메시지 표시, 로딩 표시 등)합니다.
---
2. LiveData에 에러 메시지 별도 관리
- 에러 메시지 전용 LiveData를 만들어 ViewModel에서 에러 발생 시 메시지를 전달합니다.
```kotlin
private val _error = MutableLiveData
val error: LiveData
fun fetchData() {
repository.getData()
.onSuccess { _data.value = it }
}
```
- Activity/Fragment에서 에러 LiveData를 관찰해 토스트나 다이얼로그 등으로 사용자에게 알립니다.
---
3. Coroutine + LiveData 사용 시 예외 처리
- Coroutine 내에서 `try-catch` 블록으로 예외 잡기
```kotlin
viewModelScope.launch {
try {
val result = repository.getData()
_data.value = Resource.Success(result)
} catch (e: Exception) {
_data.value = Resource.Error(e.message ?: "Unknown error")
}
}
```
---
4. SingleLiveEvent 또는 Event Wrapper 활용
- 에러 메시지를 한 번만 처리하도록 이벤트 래퍼를 적용해 중복 표시 방지
- 단순 LiveData보다 사용자 경험 개선
---
요약
- LiveData는 데이터 변경 통지 역할만 하므로 오류 상태는 데이터와 함께 별도 상태값으로 관리한다.
- Resource 같은 상태 래퍼, 별도 에러 LiveData, try-catch 처리 및 이벤트 래퍼 활용이 주된 오류 처리 방법이다.
- UI는 LiveData의 상태를 관찰하여 오류 상황에 맞는 사용자 인터페이스를 표시한다.
하지만 LiveData 자체는 데이터 스트림 관찰에 초점을 둔 컴포넌트로, 별도의 내장된 오류 처리 메커니즘을 제공하지는 않습니다.
따라서 LiveData를 사용할 때 오류 처리는 일반적으로 다음과 같은 방법으로 구현합니다.
1. 결과를 감싸는 래퍼 클래스 사용 LiveData가 데이터를 전달할 때 단순히 값만 전달하면, 오류 정보는 전달할 수 없습니다.
이를 보완하기 위해 `Resource`, `Result`, `State` 같은 래퍼 클래스를 만들어 성공, 실패, 로딩 상태와 함께 오류 메시지를 포함시키는 방식을 주로 사용합니다.
예를 들어: ```kotlin sealed class Result
UI에서는 이 상태를 관찰하면서 성공 시 데이터를, 실패 시 오류 메시지 등을 보여줄 수 있습니다.
2. LiveData를 여러개 사용해 오류 상태 전달 데이터와 오류 상태를 별개의 LiveData로 분리해서 관리할 수도 있습니다.
예를 들어, 하나는 실제 데이터 LiveData, 다른 하나는 오류 메시지를 담는 LiveData입니다.
- 장점: UI가 데이터 변경과 오류 상태를 각각 분리해서 처리 가능 - 단점: 여러 LiveData를 구독해야 하는 번거로움
3. SingleLiveEvent, Event Wrapper 활용 오류 메시지나 일회성 이벤트(예: 토스트 메시지, 다이얼로그 표시)를 전달할 때 문제가 되는 것이 LiveData가 구독자에게 다시 데이터를 전달하는 ‘재전달 문제’입니다.
이를 해결하기 위해 다음과 같은 방법을 통해 일회성 이벤트를 처리합니다.
- SingleLiveEvent : 일회성 이벤트를 전달하기 위한 커스텀 LiveData 구현체 - Event Wrapper 클래스 : 데이터를 감싸서 한 번만 소비되도록 하는 래퍼 클래스 사용
4. try-catch와 Coroutine 예외 처리 ViewModel 내에서 코루틴을 사용해 비동기 작업 수행 시, `try-catch` 블록으로 오류를 잡은 뒤, 위에서 설명한 `Result` 라이크 데이터로 오류를 LiveData에 전달하는 방식이 보편적입니다.
예: ```kotlin viewModelScope.launch { _dataLiveData.value = Result.Loading try { val response = repository.fetchData() _dataLiveData.value = Result.Success(response) } catch(e: Exception) { _dataLiveData.value = Result.Error(e) } } ```
5. Exception Handler 혹은 CoroutineExceptionHandler 활용 보다 전역적인 예외 처리를 위해 CoroutineExceptionHandler를 설정하여 예외를 중앙에서 관리하면서 LiveData 등에 알릴 수도 있습니다.
--- 요약 - LiveData는 자체적인 오류 처리 메커니즘은 없으므로, 오류 처리는 ViewModel에서 데이터를 래핑하는 별도의 상태 클래스를 만들어서 관리하는 방식이 일반적임 - 데이터, 로딩, 오류 상태를 명확히 구분하여 LiveData를 통해 UI에 전달 - 일회성 오류 메시지 전달 시 SingleLiveEvent나 Event Wrapper를 활용해 재전달 문제를 해결 - 비동기 작업의 경우 try-catch 구문과 CoroutineExceptionHandler를 활용해 오류를 잡아 적절한 LiveData 업데이트를 수행 이러한 방법들을 조합해 LiveData와 함께 안정적인 오류 처리가 이뤄지도록 구현하는 것이 좋습니다.
작성자:
최다혜 [비회원]
| 작성일자: 1년 전
2025-05-25 12:40:46
조회수: 167 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 167 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.