마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

http status 코드에 따라서 반환 값 다르게 해주는 방법

0 추천
안녕하세요

현재 accessToken을 통해 인증하는 방식으로 api를 사용중에 있습니다.

accessToken이 만료되면 refreshToken을 통해 재발급 받도록 하고싶은데,

accessToken이 만료된 상황에서 http status code는 401이 오도록 구현되어 있습니다.

문제는 401일때 오는 데이터와 200일때 오는 Object가 다르다는 것입니다.

200일때는

success: Boolean,

data: List<Data>

...

이렇게 오지만,

401일 때는

success: Boolean,

error: Error

(Data와 Error는 data class입니다.)

로 옵니다. 둘은 엄연히 다른 데이터를 저장할 수 있는 class인데,

Repository를 만들어서 반환하는 식으로 구현하였더니, 여기서 어떻게 처리를 해줘야할지 모르겠네요..

401일때는 Error를 담는 object를 반환하고싶고, 200일때는 data가 담긴 object를 반환하고싶은데 어떻게 해야할까요?
hand (1,150 포인트) 님이 2022년 12월 11일 질문

1개의 답변

0 추천

아래처럼 data와 error를 모두 포함하는 클래스를 사용하면 어떨까요?

public class ApiResponse {  
    private boolean success = false;
    @Nullable private List<Data> data = null;
    @Nullable private Error error = null;

   // Constructor, getter, setter 추가
}

 

200일 때는 data != null && error == null
401일 때는 data == null && error != null

이 되므로 여기에 따라 처리를 하시면 될 것 같은데요.

참고로 서버에서 상태코드를 리턴한다면 좀 더 정확한 처리가 가능할 것 같습니다. 현재 구조로는 에러의 경우, 401에러인지 다른 에러인지 정확하게 구분이 안갈 것 같아 보이네요.

 

spark (226,720 포인트) 님이 2022년 12월 12일 답변
답변 감사합니다 spark님

서버에서는 success라는 boolean값을 통해 성공했다 실패했다를 알려주기도 하고,
Error data class 내에서 어떤 오류인지 알려주고 있습니다.
그리고 http status code를 구분지어놔서 401일 때는 토큰이 만료된 상황이란 것을 알 수 있구요.

저도 spark님이 말씀하신대로 생각나서 Response에 공통적으로 data와 error가 들어가니 이들을 모두 넣고 if문을 통해 널인지 체크해주면 되겠다고 생각했는데,

response.isSuccessful일 때는 response.body() 내에 제대로 값이 들어와있는 것을 확인할 수 있는데,

successful이 아닐때는 response.body()에 null값만 들어와있습니다.
interceptor를 통해 로그를 확인해보면,
error data가 제대로 넘어오는 것을 확인할 수 있었거든요.

이게 response가 success가 아닐경우 무조건 null을 받나요? 제 코드를 보여드리고 싶은데, 글자수 초과로 인해서 못올리네요ㅠㅠ
Response에서 상태코드를
API 응답을 처리하는 클래스를 하나 만드셔서, 응답데이터에서 상태코드가 401인 경우는 리프레시 토큰을 가져오는 코드로 분기하게 하셔야 할 것 같구요. 나머지의 경우라면 위에서 말씀드린 것처럼, 에러와 성공데이터를 모두 포함한 오브젝트를 리턴하셔야 겠죠. 에러나 성공에 따른 처리는 이걸 호출하는 곳에서 처리하면 되구요.
Kotlin을 사용한다면 success, error를 구분하는 sealed class를 사용하면 처리가 좀 더 깔끔해 질 수 있습니다.
...