상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - LiveData에서 요청 실패 시 대처하는 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
LiveData에서 네트워크 요청이나 기타 비동기 작업이 실패했을 때 이를 적절히 처리하는 것은 사용자 경험 향상과 앱의 안정성 유지에 매우 중요합니다. LiveData 자체는 단순히 데이터를 관찰하고 변경 사항을 통지하는 기능만 제공하기 때문에, 실패 상황에 대한 처리는 보통 다음과 같은 패턴이나 추가적인 설계를 통해 이뤄집니다. 1. 상태를 표현하는 Wrapper 객체 사용하기 단순히 데이터를 저장하는 LiveData 대신, 요청의 상태(로딩, 성공, 실패 등)를 포함하는 래퍼 클래스(State wrapper)를 만들어서 관리합니다. 예를 들어 `Resource<T>` 같은 클래스를 만들어서, 네트워크 요청 결과를 다음과 같이 표현할 수 있습니다. ```kotlin <a href='https://sangseek.com/sangseeks/sealed/ko'>sealed</a> class Resource<T> { class Loading<T> : Resource<T>() data class Success<T>(val data: T) : Resource<T>() data class Error<T>(val throwable: Throwable) : Resource<T>() } ``` ViewModel에서는 LiveData<Resource<T>> 타입을 사용해 다음과 같이 상태 변화를 알립니다: - 요청 시작 시 `Loading` <a href='https://sangseek.com/sangseeks/상태 전파/ko'>상태 전파</a> - 요청 성공 시 `Success` 상태와 데이터 전파 - 요청 실패 시 `Error` 상태와 예외 정보 전파 이 방식은 UI에서 <a href='https://sangseek.com/sangseeks/에러 메시지/ko'>에러 메시지</a> 표시, 로딩 인디케이터 표시 여부, 정상 데이터 표시 등을 상태에 따라 쉽게 분기 처리할 수 있도록 해줍니다. 2. ViewModel에서 에러 관리하기 실패 시 예외 처리를 ViewModel에서 수행하고, 에러 메시지나 상태를 LiveData로 노출합니다. 예를 들어 다음과 같이 구성할 수 있습니다: ```kotlin private val _result = MutableLiveData<Resource<User>>() val result: LiveData<Resource<User>> = _result fun fetchUser() { _result.value = Resource.Loading() repository.getUser(object: Callback<User> { override fun onSuccess(data: User) { _result.value = Resource.Success(data) } override fun onFailure(error: Throwable) { _result.value = Resource.Error(error) } }) } ``` 이와 같이 하면 UI는 `result`를 관찰하며 상태에 따라 적절히 처리합니다. 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순위입니다.
수정하기
취소하기