좌표로 지역 정보를 받아오는 역지오코딩(Reverse Geocoding)을 위해 OpenWeatherMap부터 BigDataCloud API 등을 사용했지만, 사양이 안맞거나 사용 미숙으로 Ban을 당하면서 구글링을 통해 카카오맵 API로 넘어오게 되었다.
카카오맵 API는 Javascript로 맵 위주로 사용하는 거라고 생각해 Geocoding 기능이 제공되는지 모르고 있었는데,
되는 줄 알았다면 처음부터 고생은 안했지 싶다.
그래도 각 API를 사용해보면서 API 사용 경험이 많이 쌓여 금방 적응해서 쓸 수 있게 되었으니 결코 허튼 일은 아니었다.
어쨌든 이번에는 카카오맵 API로 서버 사이드에서 역지오코딩하는 방법을 알아보자.
우선 API KEY 가 있어야 한다.
API KEY 발급 방법은 하단의 링크에 상세하게 설명되어 있으니 글을 참고해 발급 받으면 된다.
▼ API KEY 발급 방법
API KEY 발급을 하고 나면, KEY를 확인할 수 있는데 이 때 Javascript에서는 Javascript 키를 사용했지만, 서버 사이드에서는 REST API 키를 사용해야하니 참고하자!
[ 적용 방법 ]
카카오 개발자 가이드에 보면 local 부분을 다룬 문서가 있다.
( https://developers.kakao.com/docs/latest/ko/local/dev-guide#coord-to-address )
내용을 확인해보면,
https://dapi.kakao.com/v2/local/geo/coord2regioncode.json?x=127&y=37
위와 같은 주소로 x, y값으로 위/경도를 작성해 요청하면 지역정보를 Json 데이터로 받아올 수 있다는 것을 알 수 있다.
그렇지만 막상 요청해보면 인증(Authorization) 문제로 데이터를 받아올 수가 없는데, 이를 위해 요청할 때 Authorization 정보를 제공해야한다. 그러나 get 방식의 주소에 파라미터를 적는 방식으로는 해결할 수 없고, URLConnection의 setRequestProperty를 통해 제공해야 한다.
제공해야하는 인증정보는 위의 카카오 개발자 가이드 문서에 기재되어 있으며, 다음과 같다.
- 제공 해야 하는 Authorization 정보 : KakaoAK {REST API 키}
이 때, KakaoAK와 REST API 키 사이에 공백 한 칸이 있어야 하는 점에 유의하자!
이제 전체 코드를 살펴보도록 하자.
/** Controller **/
public JSONObject loadLocation() {
String REST_KEY = "{위에서 제공 받은 본인의 REST KEY}";
Double lat = {위도 좌표};
Double lon = {경도 좌표};
String url = "https://dapi.kakao.com/v2/local/geo/coord2regioncode.json?x=" + lon + "&y=" + lat;
BufferedReader br = null;
JSONObject obj = new JSONObject();
ObjectMapper mapper = new ObjectMapper();
try {
URL url = new URL(url);
URLConnection conn = url.openConnection();
conn.setRequestProperty("Authorization", "KakaoAK " + REST_KEY);
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
if(br != null) obj = mapper.readValue(br, JSONObject.class);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return obj;
}
여기서 loadLocation 메소드는 필요에 따라 파라미터로 위/경도를 제공하든, AJAX로 사용하든 마음대로 변경 가능하다.
중요한 부분은 conn.setRequestProperty로 Authorization을 제공하는 방식이며, 위의 코드처럼 작성하면 JSON 데이터로 데이터를 지역 정보를 받아올 수 있다!
* 단, 이 때 결과값은 JSONObject 형이라고 가정했기 때문에 JSON형식이 아닌 다른 데이터형식일 경우 에러가 발생할 수 있다. 이 때는, 예외처리를 별도로 해주어야 하는데 아래의 글을 참고해 예외처리할 수 있으니 에러 발생 시 참고하면 좋을 것 같다.
▼ 예외처리를 위한 BufferedReader 다시 읽는 방법
🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱🏍
댓글