0%

(spring) 공공데이터 SERVICE KEY IS NOT REGISTERED ERROR 해결방법

상황

Spring Boot에서 restTemplate으로 공공데이터 API를 사용할 때, Could not extract response: no suitable HttpMessageConverter found for response type [class ~] and content type [text/xml;charset=UTF-8]가 발생했다.

해당 에러는 xml을 적절한 형식으로 변환하지 못해서 발생하는 에러이다. 이를 해결하기 위해서 class를 String으로 변경하고 확인해 보았다.

error
확인해보니, SERVICE_KEY_IS_NOT_REGISTERED_ERROR가 발생했다. 해당 에러는 서비스키가 정상적이지 않아 발생하는 에러이다. 서비스키 발급을 최근에 했다면 등록되는 시간이 필요하지만, 이미 다른 프로젝트에서 사용하고 있는 서비스키였기 때문에 이상하다고 생각했다.

해결방법

결론부터 말하자면 URI를 생성해서 사용하면 된다.

1
2
3
4
5
6
7
8
9
RestTemplate restTemplate = new RestTemplate();
URI uri = UriComponentsBuilder.fromHttpUrl(baseUrl)
.queryParam("MobileOS", "ETC")
.queryParam("MobileApp", "AppTest")
.queryParam("_type", "json")
.queryParam("serviceKey", serviceKey) // encoding serviceKey 추가
.build()
.toUri();
String response = restTemplate.getForObject(uri, String.class);

원인 분석

그러면 왜 SERVICE_KEY_IS_NOT_REGISTERED_ERROR가 발생했을까? RestTemplateString을 사용하면 자동으로 encoding이 된다. 아래 사진을 보자.
encoding

%2B%252B로 변환되었다. 이는 encoding 서비스키를 사용하면, %RestTemplate에서 한 번 더 인코딩을 해서 발생한 문제이다.

그러면 ServiceKeyDecoding 서비스키를 사용하면 되지 않을까? 라는 생각이 들 수 있다. 그렇게 사용한 결과를 확인해 보자.
decoding

+가 인코딩되지 않고 +로 들어가고, =%3D로 인코딩되어 들어가는 것을 확인할 수 있다. 이는 RestTemplate에서 +은 인코딩을 하지 않는다는 것을 알 수 있다.

그래서 URI를 생성해서 사용하면 RestTemplate에서 인코딩을 하지 않고 encoding 서비스키를 그대로 사용할 수 있다.

결론

RestTemplate에서 String을 그대로 사용할 때, encoding을 하지 않고 사용하려면 URI를 생성해서 사용하면 된다.

공공데이터 API를 사용할 때는 URI를 생성해서 Encoding 서비스키를 넣어주자.