
** 안녕하세요. 버그를 해결한 경험을 공유하는 블로그입니다🔥
< 작업 환경 >
IDE: IntelliJ
Spring Boot: 3.4.2
Java: 17
건강보험심사평가원에서 제공하는 병원정보서비스 API를 호출하여 서비스를 개발하던 중에 SERVICE_KEY_IS_NOT_REGISTERED_ERROR를 만났습니다.
공공 API를 사용하기 위해서 공공테이터포털(https://www.data.go.kr/index.do)에서 Service Key를 발급 받았는데, 해당 오류는 이 키가 유효하지 않다는 의미였습니다.
하지만 아래 이미지와 같이 API 제공 사이트에서 테스트를 했을 때는 발급 받은 키로 문제 없이 API를 호출할 수 있었습니다. 따라서 Spring Boot에서만 작동이 안되는 것은 키 유효성 문제가 아닐거라고 생각했습니다.

[결론]
API 호출 URL의 URI 요소를 인코딩한다
구글 서치를 통해서 API 호출 URL이 포함하고 있는 URI를 UTF-8로 인코딩하는 것이 해결의 요지라는 걸 알게 됐습니다. 아래는 URI 구성요소를 인코딩하는 두가지 방법입니다.
String requestUrl = UriComponentsBuilder
.fromUriString("https://apis.data.go.kr/B551182/MadmDtlInfoService2.7/getDtlInfo2.7")
.queryParam("serviceKey", serviceKey)
.queryParam("ykiho", hospital.getHospitalId())
.queryParam("_type", "json")
.build(true)
.toUriString();
String requestUrl = UriComponentsBuilder
.fromUriString("https://apis.data.go.kr/B551182/MadmDtlInfoService2.7/getDtlInfo2.7")
.queryParam("serviceKey", serviceKey)
.queryParam("ykiho", hospital.getHospitalId())
.queryParam("_type", "json")
.build()
.toUriString();
URI url = new URI(requestUrl);