[Spring MVC 프로젝트 - 기상 예보 API 사용하기] 공공데이터 API로 기상 예보 정보 가져오기

J_m2n·2023년 8월 18일
0

> 개발환경

  • Spring MVC Project
  • Eclipse 4.28
  • jdk 11
  • MySQL

> Spring MVC 프로젝트 - 기상 예보 API 사용하기

  • 공공데이터 API로 기상 예보 정보 가져오기
  • 가져온 기상 예보 정보에서 원하는 값만 가져와서 사용하기

드디어 MySQL 연동 성공으로 예약 정보를 가져올 수 있는 것을 확인했다.
아직 디테일하게 들어가면 수정할 것들이 꽤 있지만 남은 시간 동안 조원들과 같이 풀어나가기로 하고, 예약 페이지1의 핵심이자 이번 프로젝트의 가장 중요한 부분이라고 할 수 있는 오픈 API 연동을 시작하기로 했다.

> 연동할 API

  • 기상청 중기예보 조회 서비스
  • 기상청 단기예보 조회 서비스

세미 프로젝트때 카카오 맵 오픈 API 사용한 팀이 있었는데, 연동에 애를 먹었다고 하여 긴장하고 있었다.

API 2개를 사용하는 이유는 단기예보 조회 서비스는 예보일~3일까지의 자세한 기상 예보 정보를 제공하고,
중기예보 조회 서비스는 예보일로부터 3일~10일까지의 간략한 기상 예보 정보를 제공하는데,
우리는 오늘 날짜에서 7일 간의 날씨 정보가 필요하기 때문이다.



공공데이터 홈페이지에 가면 각 API마다 사용 언어에 따라 적용하는 방법이 다 자세히 나와 있으니 크게 어렵진 않을 것이다.



저는 JAVA를 사용하니 JAVA 코드로 설명하겠습니다.

공공데이터 URL 넣기

StringBuilder urlBuilder = new StringBuilder(url);

여기서 url은 자신이 사용할 공공데이터의 url이다.
(공공데이터마다 url이 다르니 해당 url을 넣어주면 됨)

서비스키 넣기

URLEncoder.encode("serviceKey","UTF-8") + "="+skey); /*Service Key*/

이 부분에는 각자 본인에게 할당된 서비스키를 넣는다.



서비스키 확인하는 방법
공공데이터포털 로그인 -> 마이페이지 encoding과 decoding 중 잘 되는 걸로 선택해서 사용하면 됨


요청 자료 형식 설정

URLEncoder.encode("JSON", "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/

우리는 JSON으로 받아올 거라서 "JSON" 입력



예보 발표일자 넣기

URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(today, "UTF-8"));

base_date는 예보일자, 즉 기상 예보 정보가 발표된 날짜를 의미한다. 나는 오늘부터의 날씨 정보가 필요하므로 오늘 날짜의 정보를 담은 today 변수를 넣어줬다.



예보 발표 시각 넣기

URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode("0200", "UTF-8")); /*02시 발표(정시단위) */

base_time은 기상 예보 정보가 발표된 시간을 의미한다. 이건 기상 정보 종류에 따라 발표되는 시각이 다 다르고 발표 시각마다 제공되는 정보도 다르니 API 설명을 참고해서 원하는 정보를 제공하는 발표 시각을 찾아서 넣으면 된다.



원하는 지역의 좌표 넣기

urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(nx, "UTF-8")); /*예보지점의 X 좌표값*/
urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(ny, "UTF-8")); /*예보지점의 Y 좌표값*/

API 사용법에 엑셀로 각 지역별 nx, ny 좌표값이 정리된 것이 있다. 그걸 보고 원하는 지역의 좌표값을 넣어주면 됨.



API 가져오기 전체코드

StringBuilder urlBuilder = new StringBuilder(url); /*단기예보조회 URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "="+skey); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("1000", "UTF-8")); /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode("JSON", "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/
        urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(today, "UTF-8"));
        urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode("0200", "UTF-8")); /*02시 발표(정시단위) */
        urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(nx, "UTF-8")); /*예보지점의 X 좌표값*/
        urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(ny, "UTF-8")); /*예보지점의 Y 좌표값*/
        URL url = new URL(urlBuilder.toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        System.out.println("Response code: " + conn.getResponseCode());
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        String sb = "";
        String line;
        while ((line = rd.readLine()) != null) {
            sb += line;
        }
        rd.close();
        conn.disconnect();
profile
코딩 초짜입니다

2개의 댓글

comment-user-thumbnail
2023년 8월 18일

정보 감사합니다.

1개의 답글