[Android/Java] 공공 데이터 포털 OpenAPI 에러(Expected BEGIN_OBJECT but was STRING at line 1 column 1 path)
Open API는 네이버나 날씨, 책 정보 등 여러 API들을 사용해봐서 꽤나 익숙하다고 생각했는데 이번에 공공 데이터 포털에서 제공하는 데이터를 사용한 안드로이드 프로젝트를 만들면서 벽에 자주 부딫혔던 것 같다.
응답 실패 메시지
이번에 프로젝트를 만들며 가장 오래 해결하지 못한 것인 "응답 실패 메시지"다. 내가 사용하려던 API는 응답 메시지 포멧으로 JSON, XML을 지원했고 나는 여러 측면에서 JSON이 더 낫다고 판단해 JSON으로 응답을 받고 있었다. 테스트 과정에서 정상적인 응답을 받는데에는 아무 문제가 없었으나 실패 메시지를 받으려 하면 위와 같은 에러 메시지를 출력했다.
에러 내용을 보면 알 수 있듯 JSON 구문 오류 예외가 발생한 것인데, 응답 성공 시에는 정상적으로 데이터를 파싱하여 객체에 바인딩하였음에도 불구하고 실패 시에만 이런 에러가 뜨니 인지 부조화가 올 것만 같았다.
응답 성공 메시지
{
"header": {
"resultCode":"00",
"resultMsg":"NORMAL SERVICE"
},
"body":{
"items":[
{
..
}
]
,"numOfRows":3
,"pageNo":2
,"totalCount":135
}
}
공공 데이터 포털에서 제공하는 API 문서를 보면 응답 메시지는 header와 body로 나뉘어져 있고 header에는 요청에 대한 결과 코드와 메시지가, body에는 요청한 데이터가 들어있음을 볼 수 있다. 성공했을 경우 header의 resultCode에 00이 보내져 오기 때문에 당연히 오류가 났을 때에도 resultCode에 에러 코드가 들어있을 것이라 생각했다.
문제 원인
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(getOkHttpClient())
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
어느 정도 시간을 날리고 에러를 해결하지 못한 상태에서 든 해결법은 직접 파싱이었다. 컨버터가 제대로 동작하지 않는 것 같으니 내가 원시 데이터를 받아서 직접 파싱하자는 생각으로 JSON 데이터를 자동으로 파싱, 바인딩해주는 GSON 컨버터를 지우고 문자열 그대로 데이터를 읽어 주는 Scalar 컨버터를 추가했다.
그리고 결과를 로그에 출력해보니 위와 같은 메시지가 출력되었는데 나는 그토록 보고 싶었던 에러 메시지 내용이나 에러 코드보다 구문에 눈길이 갔다. 나는 줄곧 JSON으로 통신을 하고 있다고 생각했는데 전달받은 실패 메시지는 XML 형식이었다. 분명히 JSON으로 데이터를 요청했고 요청에 성공했을 때 데이터 형식은 JSON이었지만 실패했을 땐 XML로 데이터가 반환된 것이다.
내가 사용해 본 API들은 모두 성공, 실패 시 응답 메시지 형식이 같았기에 정말 상상도 못한 원인이었다. 이게 무슨 일인가 싶어서 공공 데이터 포털에 문의했고 일주일 만에 받은 답변은 "요청 실패 시, 응답 메시지의 형식은 무조건 XML"이라는 것이었다. 응답 성공 시 반환하는 메시지는 Header의 결과 코드와 결과 메시지 파라미터를 따로 뒀음에도 불구하고 실패 메시지는 그 형식을 따르지 않고 XML을 사용하고 있다는게 이해가 가질 않았다. 그럼 성공 메시지에서 header는 반드시 성공 메시지, 코드만 보내온다는 것인데 그럼 header를 두는게 의미가 없지 않은가..
이런 일이 자주 있는 것인지는 모르겠으나 API 문서에는 이런 말이 일언반구도 없었기에... 좀 허탈했던 것 같다. 어쨌거나 API를 쓰려면 문제를 해결해야 했고 조금 고민한 결과 Scalar로 원시 데이터를 받아 직접 파싱하여 문제를 해결했다.
공공 데이터 포털이 분명 좋은 사이트인 것은 맞는 것 같은데 오탈자나 오기, 사용자에게 불친절한 문서들이 너무 많다. 특히 서비스를 시작한 날짜가 오래되면 오래 될수록 더 심해진다. 그리고 궁금증이 생겼을 때 데이터 포털 자체에 문의하면 하루나 이틀 안에 답해주지만 각 API 관련 단체로 오류 문의를 넣으면 답장을 받기까지 일주일에서 열흘은 걸려서 너무 답답하다.
제일 화나는 것은 복붙을 한 것인지, 데이터 형식에 지원되지 않는 것을 적어놓거나 응답 파라미터에 잘못된 것을 적어 놓은 것들이다. 설마 API 문서에 오류가 있겠어 하고 철썩같이 믿고 했다가 엿을 먹은 적이 한 두 번이 아니었다. 제공하는 문서나 데이터에 좀 더 신뢰성이 있었으면 좋겠다.