retrofit 과 통신을 하다보면 클라이언트 측에서 잘못된 request를 보내거나 또는 서버 측에서

문제 있을때 errorBody()에 값이 넘어 올때가 있다

레트로핏은 응답의 Http 상태코드가 200이던 400이던 상관없이

통신이 성공하면 onResponse() 콜백을 타게 된다

(인터넷 장애로 인한 통신 실패일 경우, 파싱 에러 등 onFailure() 콜백을 탄다)

그래서 body가 null 인지 그리고 응답 상태 코드, 응답이 성공적으로 왔는지 체크를 해야한다

fun getErrorResponse(errorBody: ResponseBody): ErrorResponse?{
    return retrofit.responseBodyConverter<ErrorResponse>(
        ErrorResponse::class.java,
        ErrorResponse::class.java.annotations
    )?.convert(errorBody)
}

먼저 errorResponse를 정의 해주는 data class를 생성 후

위 와 같이errorbody를 convert 해주는 함수를 만든다

그다음 레트로핏 응답값 코드가 성공적으로 왔을때 아닐때 구분 해준다.

만일 null이나 에러코드로 왔을때 에러 코드를 체킹 해준다

에러코드 체킹후 errorbody값을 errorResponse에 있는 객체로 변환 시켜 준다.

fun requestUser(

	onSuccess: (DataListResponse) -> Unit,
	notSuccess: (ErrorResponse) -> Unit,
	onFailure: (e: String) -> Unit
) {
	retrofitClient.addUser().enqueue(object : Callback<DataListResponse> {
            override fun onResponse(
                call: Call<DataListResponse>,
                response: Response<AddUserResponse>
            ) {
                val body = response.body()
                if (body != null && response.isSuccessful) {
                    onSuccess(body)
                } else {
                    val errorCode = HttpException(response).code()
										if (errorCode in 400..599){
												val errorBody = response.errorBody()
												if(errorBody != null) {
														callback.onError(ServiceClient.getErrorResponse(errorBody)
												}
                }
            }

            override fun onFailure(call: Call<AddUserResponse>, t: Throwable) {
                callback.onFailure(t)
            }
        })
			}