본문으로 바로가기

네트워크 DB 에서 데이터를 불러올 때,

return try {} catch{} 문으로 데이터 로드 실패 시에 대한 로그를 따로 찍어두고 싶었다.

 

문제는 이렇게하면 try와 catch 시의 리턴 타입이 다르기 때문에 Wrapper 클래스를 따로 작성해야 한다는 것인데, 다음과 같이 Wrapper 클래스를 작성하였다.

sealed class Response<out T> {
    class Loading<out T> : Response<T>()
    data class Success<out T>(val data: T) : Response<T>()
    data class Failure<out T>(val throwable: Throwable) : Response<T>()
}

그리고 레포지토리에서 다음과 같이 사용하게 된다.

return try {		
			//...~ val result = 
            Response.Success(result)
        } catch (exception: Exception) {
            Response.Error(exception)
        }

그리고 뷰모델에서는 다음과 같이 결과값을 받는다.

when(res){
    is Response.Loading -> { print("Loading...") }
    is Response.Success -> { it->
    		print("Success...") 
    }
    is Response.Failure -> { print("Failure...") }
}

 

위와 같이 Wrapper 클래스를 사용했을 때의 장점 :

성공했을 때, 실패했을 때 경우를 나눠 로그를 찍거나 작업을 이어가게 끔 할 수 있다.

 

단점 : 코드가 다소 난잡해보이고 더러워 보일 수 있다.