상황
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으로 변경하고 확인해 보았다.
확인해보니, SERVICE_KEY_IS_NOT_REGISTERED_ERROR
가 발생했다. 해당 에러는 서비스키가 정상적이지 않아 발생하는 에러이다. 서비스키 발급을 최근에 했다면 등록되는 시간이 필요하지만, 이미 다른 프로젝트에서 사용하고 있는 서비스키였기 때문에 이상하다고 생각했다.
해결방법
결론부터 말하자면 URI
를 생성해서 사용하면 된다.
1 | RestTemplate restTemplate = new RestTemplate(); |
원인 분석
그러면 왜 SERVICE_KEY_IS_NOT_REGISTERED_ERROR
가 발생했을까? RestTemplate
에 String
을 사용하면 자동으로 encoding
이 된다. 아래 사진을 보자.
%2B
가 %252B
로 변환되었다. 이는 encoding 서비스키
를 사용하면, %
를 RestTemplate
에서 한 번 더 인코딩을 해서 발생한 문제이다.
그러면 ServiceKey
를 Decoding 서비스키
를 사용하면 되지 않을까? 라는 생각이 들 수 있다. 그렇게 사용한 결과를 확인해 보자.
+
가 인코딩되지 않고 +
로 들어가고, =
은 %3D
로 인코딩되어 들어가는 것을 확인할 수 있다. 이는 RestTemplate
에서 +
은 인코딩을 하지 않는다는 것을 알 수 있다.
그래서 URI
를 생성해서 사용하면 RestTemplate
에서 인코딩을 하지 않고 encoding 서비스키
를 그대로 사용할 수 있다.
결론
RestTemplate
에서 String
을 그대로 사용할 때, encoding
을 하지 않고 사용하려면 URI
를 생성해서 사용하면 된다.
공공데이터 API를 사용할 때는 URI
를 생성해서 Encoding 서비스키
를 넣어주자.