글 작성자: 허접프로그래머

최근 공공데이터 포털에서 Bus앱을 만들기위해서 API키값을 불러와야하는 상황이 있었다 . 현재 개발중인 프로젝트 Spring boot로 계속적으로 API를 읽고 Parsing하기에 편한 내부 함수를 RestTemplate를 활용해서 그 Json값을 바로 파싱 받으려했었다. 

 

문제는 service key is not registered error 가 지속적으로 발생했다는 점이다. 나는 이 오류가 도대체 왜? 발생하는지 정확한 이유를 알 수가 없어서, 분명히 String값에서 바뀔리는 없다고 문제점을 엄한 곳에서 찾기 시작했는데...

 

일단 문제를 재대로 파악해보자

실제로 Data.or.kr를 가서 확인해보면 대부분 Q&A 관련 사이트나 혹은 service key is not registered error라는 구글에 검색을 해보면 여러가지 대안이 많이 나오게된다.

물론 그렇다고 해결이 뚝딱되는 건 아니지만...

FAQ  게사판에는 해결 방안은 간단하게 적혀있다만... 우째 Q&A와 구글 검색에는 게시글이 넘처흐른다.

일단 제일 유력한 문제로 동기화와 UTF-8인코딩 문제가 가장 많은 문제인데, 

Q&A에 문의해본 결과, 동기화는 잘되있다고 한다.

동기화의 경우는 대부분 잘 되기때문에 Q&A에 물어보면 동기화 문제를 가장 많이 언급하고 있었고, 그럼 확인해볼만한 문제는 Encoding이나 Decoding문제일 가능성이 컸다.

 

그런데 왜 안되냐고...

그래서 여러가지 방식을 통해서 해결해보려고 했다. 

URLEncoding URLDecoding방식등 여러방법을 사용했으나 결과는 늘 service key is not registered error 

문제해결에 있어서 전혀 진척이 없었다. ㅡㅡ;

 

그래서 URL을 확인해봤는데... 서비스키 부분의 값이 좀 이상한거였다.  (서비스 키라서 뒷부분은 절사)

 

기존값 : ServiceKey=JiqMumCy%2FR

처리값 : ServiceKey=JiqMumCy%252FR

 

이건 브라우저에서 이 URI로 확인해도 같은 오류를 내뱉는다. 

 

그렇다면, %+25로 처리된 것을 막기위해서는 이 서비스 키 값을 String으로 그냥 처리해서는 안되기때문에, 

 

URI uri = new URI(url); //URI 코드 % -> 25 encoding 방지.

 

다음과 같이 URI 객체를 활용해서 처리하면 위와 같은 문제는 해결되어진다.

 

근데 또 문제가 생긴다. 

 

"items":{"item":[{"citycode":12,"cityname":"세종특별시"} 

 

이번에는 받아온 JSON의 값이 깨져서 온다.  (제발 그만... 좀... )

 

JSON Encoding 방식도 바꿔야한다.

 

r.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

 

결국 안에서 UTF-8 인코딩이 되있지 않아서 발생하는 문제일 것이다. uri 전달시에 Charset도 보내주지 않아서 발생하는 문제처럼 보이는데, 후.. 뭔가 쉽게 해야할 일을 돌아 돌아 가는 것 같다. 

 

이러면 결과값도 무난하게 잘 나오게 된다.

 

{"items":{"item":[{"citycode":12,"cityname":"세종특별시"}

 

결론

결국에는 문제가 발생하는 원인은 URI에 있을 가능성이 커보인다. 동기화의 경우는 Q&A에서 확인해보면 되고, 실제로 URL에서 Encoding이 한번 더 되거나 %와 같은 문제에 추가적으로 문자열이 더 붙어버리면 내가 아는 Service 키와 다른 키가 되서 처리가 될 수 도 있으니 각 언어 처리 방식별로  URI 변환이나 String 값의 변화를 꼭 확인 해보는 것이 좋아보인다.