오늘 다뤄볼 내용은 SandWich에 관해서이다.
샌드위치 라이브러리
우리가 네트워크 처리를 할때 Retrofit을 자주 이용할것이다. 하지만 매우 번거롭게도,
Http에 대한 요청과 exception에 대한것을 전부 캐치하는것에 방대한 시간이 든다.
특히 flow를 활용했을땐 특히 하나하나 요청에대한 처리를 해줘야한다.
하지만 Sandwich를 사용하면 어떨까?
@WorkerThread
fun getLoginData(
wrkr_id: String,
wrkr_password: String,
onSuccess: () -> Unit,
onError: (String) -> Unit,
onException: (String) -> Unit
) = flow<MtInspMan> {
val response = waterService.inspManlogin(wrkr_id, wrkr_password)
response.suspendOnSuccess {
data.whatIfNotNull { response ->
onSuccess()
emit(response)
}
}
.onError {
onError(message())
}
.onException {
onException(message())
}
}.flowOn(Dispatchers.IO)
현재 repository에 대한 코드이다.
Sandwich를 사용하지 않았다면 네트워크에서 일어나는 수많은 Error처리를 개발자가 담당해야 한다.
또한 값이 제대로 넘어오지않아도 Retrofit에선 성공으로 보기때문에 거기에대한 fitering도 생각해야한다.
하지만, Sandwich를 쓰면,
waterepository.getLoginData(id.value, password.value,
onSuccess = {
isLoding.value = false
event(Event.successEvent("success"))
},
onError = { error ->
isLoding.value = false
event(Event.errorEvent("아이디나 비밀번호가 틀립니다."))
},
onException = {
isLoding.value = false
event(Event.errorEvent("서버가 불안정합니다. 다시 시도해 주세요"))
}
).collect {
it.toString()
}
위의 Viewmodel 코드가 단순히 핸들링된 Error와 Success, Exception만
처리하면 되기때문에 매우 간단해진다.