공공데이터포털 SERVICE_KEY_IS_NOT_REGISTERED_ERROR

SEPTEMBER·2025년 2월 11일
post-thumbnail

** 안녕하세요. 버그를 해결한 경험을 공유하는 블로그입니다🔥

< 작업 환경 >
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 구성요소를 인코딩하는 두가지 방법입니다.

#1 UriComponentsBuilder

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();
  • UriComponentsBuilder의 build(true)를 사용하면 URI 구성 요소를 모두 인코딩해서 URL을 반환해 줍니다

#2 URLEncoder

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);
                        
  • 또는 URL을 URI 생성자를 통해서 인코딩할 수도 있습니다.

<참고>
https://velog.io/@cco2416/%EC%A1%B8%EC%97%85%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8F%AC%ED%84%B8-service-key-is-not-registered-error-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95

0개의 댓글