좌표의 위도와 경도의 값을 가지고 해당 좌표에 대한 지역 정보를 알아내는 작업을 해야했다.
이 기능은 NCP 어플리케이션에서 Reverse Geocoding 서비스를 사용하면 된다.
그러면 아까 생성한 어플리케이션에서 "변경"을 누르고 필요한 Reverse Geocoding 서비스를 추가적으로 선택해 저장한다.
진짜 여기서 중요한 건, 얘는 프론트에서 호출하기에 매우매우 어렵다 (내 기준). 이 API같은 경우에는 브라우저에서 pre flight 문제가 있었다.
그냥 Get 메소드를 사용해 API를 호출하면 그것만 딱 갔다오는 게 아니라, OPTIONS 메소드를 브라우저 단에서 톡 다녀오고, 그 서버(네이버 지도)에서 기대하는 응답을 해야 내가 첫판에 요청한 Get 메소드가 쏴지는데.. 이게 OPTIONS로 네이버 지도 reverse 지오코딩 API를 호출했을 때 문제가 생긴다. 그래서 내가 목적으로 한 GET 메소드는 아예 쏴지지도 않는다.
이 문제를 해결하려고 여러차례 시도했지만, 구글링한 해결책들은 근본적인 해결 방법이 아니기 때문에 패스. 결국 이 API 호출 기능은 백엔드로 옮겨졌다.
백엔드는 Spring boot 프레임웤을 사용하고 있는데, 여기서는 뭐 쉽게 httpClient를 사용해 Get으로 쭉 때리고 원하는 정보를 바로 받아올 수 있었다.
그래서 이 API를 사용해서 지역 정보에 대해서 찾을 수 있었다.
API를 쏘는 법과, 응답 결과에 대한 예시는 이곳에서 확인해본다.
public JsonNode get(String requestURL) {
try {
HttpClient client = HttpClientBuilder.create().build();
HttpGet getRequest = new HttpGet("https://naveropenapi.apigw.ntruss.com/map-reversegeocode/v2/gc?output=json&orders=roadaddr");
getRequest.setHeader("X-NCP-APIGW-API-KEY-ID", "클라이언트 ID");
getRequest.setHeader("X-NCP-APIGW-API-KEY", "클라이언트 Key");
HttpResponse response = client.execute(getRequest);
//Response 출력
if (response.getStatusLine().getStatusCode() == 200) {
ResponseHandler<String> handler = new BasicResponseHandler();
String body = handler.handleResponse(response);
ObjectMapper mapper = new ObjectMapper();
JsonNode bodyJson = mapper.readTree(body);
return bodyJson;
} else {
log.debug("response is error: {}", response.getStatusLine().getStatusCode());
return null;
}
} catch (Exception e) {
log.debug("error: {}", e.toString());
return null;
}
}
리팩토링 시급.시급....한 내 코드. 일단 빠르게 짜봐서 이런 거예요.. 지금이라도 리팩토링 해야하는데 그럼 포스팅 쓰기 귀찮아질 것 같으니까.. 일단 쓰고..리팩토링 하고..코드 바꿀게여..
그래서 이렇게 호출하면 나는 roadAddr만 얻는 것으로 호출했기 때문에 그에 해당하는 정보들이 주르륵 나온다. 거기에는 내가 원하는 지역. 예를 들어, 도 단위, 또는 시나 구 단위, 또는 동 단위 등에 대한 데이터들이 포함된다. 그래서 그 응답을 json parsing해서 데이터를 겟하면 된다.