본문 바로가기
Web Development/API

[Java / API] 카카오맵 API로 서버(Controller) 사이드에서 역지오코딩하기(Reverse Geocoding)

by 감자맹고우 2022. 3. 23.
728x90
반응형

좌표로 지역 정보를 받아오는 역지오코딩(Reverse Geocoding)을 위해 OpenWeatherMap부터 BigDataCloud API 등을 사용했지만, 사양이 안맞거나 사용 미숙으로 Ban을 당하면서 구글링을 통해 카카오맵 API로 넘어오게 되었다.

 

카카오맵 API는 Javascript로 맵 위주로 사용하는 거라고 생각해 Geocoding 기능이 제공되는지 모르고 있었는데,

되는 줄 알았다면 처음부터 고생은 안했지 싶다.

그래도 각 API를 사용해보면서 API 사용 경험이 많이 쌓여 금방 적응해서 쓸 수 있게 되었으니 결코 허튼 일은 아니었다.

 

어쨌든 이번에는 카카오맵 API로 서버 사이드에서 역지오코딩하는 방법을 알아보자.

 

우선 API KEY 가 있어야 한다.

API KEY 발급 방법은 하단의 링크에 상세하게 설명되어 있으니 글을 참고해 발급 받으면 된다.

 

▼ API KEY 발급 방법

 

[Javascript / API] 카카오맵 API 연동으로 좌표 및 마커 표시하기 A to Z (에러 포함)

프로젝트에서 지도를 클릭해 위/경도(위도, 경도) 좌표를 처리해야하는 기능 구현이 필요하게 되었다. 구글링을 통해서, 네이버맵보다 카카오맵이 개발이 용이하고 로딩이 빠르다고 하여 카카

devlifetestcase.tistory.com

 

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 다시 읽는 방법

 

[Java] BufferedReader 다시 읽는 방법 (feat.mark, reset 사용법)

프로젝트 진행 중에 외부 API 데이터를 끌어와 json 형태로 보여주는 기능을 구현해야 했다. 기능 자체는 이미 API에서 제공하고 있기에 금방 구현했지만, 간헐적으로 에러가 콘솔창에 찍혔다. < 구

devlifetestcase.tistory.com

 

🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱‍🏍

 

728x90
반응형

댓글