> 개발환경
- Spring MVC Project
- Eclipse 4.28
- jdk 11
- MySQL
> Spring MVC 프로젝트 - 기상 예보 API 사용하기
- 공공데이터 API로 기상 예보 정보 가져오기
- 가져온 기상 예보 정보에서 원하는 값만 가져와서 사용하기
> 연동할 API
- 기상청 중기예보 조회 서비스
- 기상청 단기예보 조회 서비스
API 2개를 사용하는 이유는 단기예보 조회 서비스는 예보일~3일까지의 자세한 기상 예보 정보를 제공하고,
중기예보 조회 서비스는 예보일로부터 3일~10일까지의 간략한 기상 예보 정보를 제공하는데,
우리는 오늘 날짜에서 7일 간의 날씨 정보가 필요하기 때문이다.
공공데이터 홈페이지에 가면 각 API마다 사용 언어에 따라 적용하는 방법이 다 자세히 나와 있으니 크게 어렵진 않을 것이다.
공공데이터 URL 넣기
StringBuilder urlBuilder = new StringBuilder(url);
여기서 url은 자신이 사용할 공공데이터의 url이다.
(공공데이터마다 url이 다르니 해당 url을 넣어주면 됨)
서비스키 넣기
URLEncoder.encode("serviceKey","UTF-8") + "="+skey); /*Service Key*/
이 부분에는 각자 본인에게 할당된 서비스키를 넣는다.
요청 자료 형식 설정
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();
정보 감사합니다.