# 사전준비: OpenAPI Key를 발급받습니다.
https://www.data.go.kr/data/15057210/openapi.do
1. 공공데이터포털 API Response 데이터를 활용 받은 JSON 정보를 받을 DTO 생성
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
public class WthrHourDto {
@JsonProperty("response")
private Response response;
public Response getResponse() {
return response;
}
public void setResponse(Response response) {
this.response = response;
}
public static class Response {
@JsonProperty("body")
private Body body;
@JsonProperty("header")
private Header header;
public Body getBody() {
return body;
}
public void setBody(Body body) {
this.body = body;
}
public Header getHeader() {
return header;
}
public void setHeader(Header header) {
this.header = header;
}
}
public static class Body {
@JsonProperty("totalCount")
private int totalCount; // 데이터 총 개수
@JsonProperty("numOfRows")
private int numOfRows; // 한 페이지당 표출 수
@JsonProperty("pageNo")
private int pageNo; // 페이지 수
@JsonProperty("items")
private Items items; //
@JsonProperty("dataType")
private String dataType; // 응답 자료 형식
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getNumOfRows() {
return numOfRows;
}
public void setNumOfRows(int numOfRows) {
this.numOfRows = numOfRows;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
}
public static class Items {
@JsonProperty("item")
private List<Item> item;
public List<Item> getItem() {
return item;
}
public void setItem(List<Item> item) {
this.item = item;
}
}
public static class Item {
@JsonProperty("m03Te")
private String m03Te; // 30cm 지중 온도(섭씨)
@JsonProperty("m02Te")
private String m02Te; // 20cm 지중 온도(섭씨)
@JsonProperty("m01Te")
private String m01Te; // 10cm 지중 온도(섭씨)
@JsonProperty("m005Te")
private String m005Te; // 5cm 지중 온도(섭씨)
@JsonProperty("tsQcflg")
private String tsQcflg; // 지면 온도 품질 검사 플래그
@JsonProperty("ts")
private String ts; // 지면 온도(섭씨)
@JsonProperty("dmstMtphNo")
private String dmstMtphNo; // 현상번호(국내식)
@JsonProperty("gndSttCd")
private String gndSttCd; // 지면상태 => 종료 16.7.1.00 시
@JsonProperty("vs")
private String vs; // 시정(10m)
@JsonProperty("lcsCh")
private String lcsCh; // 최저운고(100m)
@JsonProperty("clfmAbbrCd")
private String clfmAbbrCd; // 운형(운형약어)
@JsonProperty("dc10LmcsCa")
private String dc10LmcsCa; // 중하층운량(10분위)
@JsonProperty("dc10Tca")
private String dc10Tca; // 전운량(10분위)
@JsonProperty("hr3Fhsc")
private String hr3Fhsc; // 3시간 신적설(cm)
@JsonProperty("dsnw")
private String dsnw; // 적설(cm)
@JsonProperty("icsr")
private String icsr; // 일사(MJ/m2): 지표면에 도달한 태양복사에너지. 태양복사(단파복사)를 말하지만 여러 요인들로 인해 태양상수보다 작게 나온다.
@JsonProperty("ssQcflg")
private String ssQcflg; // 일조 품질검사 플래그
@JsonProperty("ss")
private String ss; // 일조(hr): 태양 광선이 구름이나 안개로 가려지지 않고 땅 위를 비치는 것
@JsonProperty("psQcflg")
private String psQcflg; // 일조 품질검사 플래그
@JsonProperty("ps")
private String ps; // 해면기압
@JsonProperty("paQcflg")
private String paQcflg; // 해면기압 품질검사 플래그
@JsonProperty("pa")
private String pa; // 현지기압(hPa)
@JsonProperty("td")
private String td; // 이슬점온도(섭씨)
@JsonProperty("pv")
private String pv; // 증기압(hPa)
@JsonProperty("hmQcflg")
private String hmQcflg; // 습도 품질검사 플래그
@JsonProperty("hm")
private String hm; // 습도(%)
@JsonProperty("wdQcflg")
private String wdQcflg; // 풍향 품질검사 플래그
@JsonProperty("wd")
private String wd; // 풍향(16방위)
@JsonProperty("wsQcflg")
private String wsQcflg; // 풍향 품질검사 플래그
@JsonProperty("ws")
private String ws; // 풍속(m/s)
@JsonProperty("rnQcflg")
private String rnQcflg; // 강수량 품질검사 플래그
@JsonProperty("rn")
private String rn; // 강수량(mm)
@JsonProperty("taQcflg")
private String taQcflg; // 기온 품질검사 플래그
@JsonProperty("ta")
private String ta; // 기온(섭씨)
@JsonProperty("stnNm")
private String stnNm; // 종관기상관측 지점명
@JsonProperty("stnId")
private String stnId; // 지점 번호
@JsonProperty("rnum")
private String rnum; // 목록 순서
@JsonProperty("tm")
private String tm; // 시간
public String getM03Te() {
return m03Te;
}
public void setM03Te(String m03Te) {
this.m03Te = m03Te;
}
public String getM02Te() {
return m02Te;
}
public void setM02Te(String m02Te) {
this.m02Te = m02Te;
}
public String getM01Te() {
return m01Te;
}
public void setM01Te(String m01Te) {
this.m01Te = m01Te;
}
public String getM005Te() {
return m005Te;
}
public void setM005Te(String m005Te) {
this.m005Te = m005Te;
}
public String getTsQcflg() {
return tsQcflg;
}
public void setTsQcflg(String tsQcflg) {
this.tsQcflg = tsQcflg;
}
public String getTs() {
return ts;
}
public void setTs(String ts) {
this.ts = ts;
}
public String getDmstMtphNo() {
return dmstMtphNo;
}
public void setDmstMtphNo(String dmstMtphNo) {
this.dmstMtphNo = dmstMtphNo;
}
public String getGndSttCd() {
return gndSttCd;
}
public void setGndSttCd(String gndSttCd) {
this.gndSttCd = gndSttCd;
}
public String getVs() {
return vs;
}
public void setVs(String vs) {
this.vs = vs;
}
public String getLcsCh() {
return lcsCh;
}
public void setLcsCh(String lcsCh) {
this.lcsCh = lcsCh;
}
public String getClfmAbbrCd() {
return clfmAbbrCd;
}
public void setClfmAbbrCd(String clfmAbbrCd) {
this.clfmAbbrCd = clfmAbbrCd;
}
public String getDc10LmcsCa() {
return dc10LmcsCa;
}
public void setDc10LmcsCa(String dc10LmcsCa) {
this.dc10LmcsCa = dc10LmcsCa;
}
public String getDc10Tca() {
return dc10Tca;
}
public void setDc10Tca(String dc10Tca) {
this.dc10Tca = dc10Tca;
}
public String getHr3Fhsc() {
return hr3Fhsc;
}
public void setHr3Fhsc(String hr3Fhsc) {
this.hr3Fhsc = hr3Fhsc;
}
public String getDsnw() {
return dsnw;
}
public void setDsnw(String dsnw) {
this.dsnw = dsnw;
}
public String getIcsr() {
return icsr;
}
public void setIcsr(String icsr) {
this.icsr = icsr;
}
public String getSsQcflg() {
return ssQcflg;
}
public void setSsQcflg(String ssQcflg) {
this.ssQcflg = ssQcflg;
}
public String getSs() {
return ss;
}
public void setSs(String ss) {
this.ss = ss;
}
public String getPsQcflg() {
return psQcflg;
}
public void setPsQcflg(String psQcflg) {
this.psQcflg = psQcflg;
}
public String getPs() {
return ps;
}
public void setPs(String ps) {
this.ps = ps;
}
public String getPaQcflg() {
return paQcflg;
}
public void setPaQcflg(String paQcflg) {
this.paQcflg = paQcflg;
}
public String getPa() {
return pa;
}
public void setPa(String pa) {
this.pa = pa;
}
public String getTd() {
return td;
}
public void setTd(String td) {
this.td = td;
}
public String getPv() {
return pv;
}
public void setPv(String pv) {
this.pv = pv;
}
public String getHmQcflg() {
return hmQcflg;
}
public void setHmQcflg(String hmQcflg) {
this.hmQcflg = hmQcflg;
}
public String getHm() {
return hm;
}
public void setHm(String hm) {
this.hm = hm;
}
public String getWdQcflg() {
return wdQcflg;
}
public void setWdQcflg(String wdQcflg) {
this.wdQcflg = wdQcflg;
}
public String getWd() {
return wd;
}
public void setWd(String wd) {
this.wd = wd;
}
public String getWsQcflg() {
return wsQcflg;
}
public void setWsQcflg(String wsQcflg) {
this.wsQcflg = wsQcflg;
}
public String getWs() {
return ws;
}
public void setWs(String ws) {
this.ws = ws;
}
public String getRnQcflg() {
return rnQcflg;
}
public void setRnQcflg(String rnQcflg) {
this.rnQcflg = rnQcflg;
}
public String getRn() {
return rn;
}
public void setRn(String rn) {
this.rn = rn;
}
public String getTaQcflg() {
return taQcflg;
}
public void setTaQcflg(String taQcflg) {
this.taQcflg = taQcflg;
}
public String getTa() {
return ta;
}
public void setTa(String ta) {
this.ta = ta;
}
public String getStnNm() {
return stnNm;
}
public void setStnNm(String stnNm) {
this.stnNm = stnNm;
}
public String getStnId() {
return stnId;
}
public void setStnId(String stnId) {
this.stnId = stnId;
}
public String getRnum() {
return rnum;
}
public void setRnum(String rnum) {
this.rnum = rnum;
}
public String getTm() {
return tm;
}
public void setTm(String tm) {
this.tm = tm;
}
@Override
public String toString() {
return "Item{" +
" m03Te='" + m03Te + '\'' +
", m02Te='" + m02Te + '\'' +
", m01Te='" + m01Te + '\'' +
", m005Te='" + m005Te + '\'' +
", tsQcflg='" + tsQcflg + '\'' +
", ts='" + ts + '\'' +
", dmstMtphNo='" + dmstMtphNo + '\'' +
", gndSttCd='" + gndSttCd + '\'' +
", vs='" + vs + '\'' +
", lcsCh='" + lcsCh + '\'' +
", clfmAbbrCd='" + clfmAbbrCd + '\'' +
", dc10LmcsCa='" + dc10LmcsCa + '\'' +
", dc10Tca='" + dc10Tca + '\'' +
", hr3Fhsc='" + hr3Fhsc + '\'' +
", dsnw='" + dsnw + '\'' +
", icsr='" + icsr + '\'' +
", ssQcflg='" + ssQcflg + '\'' +
", ss='" + ss + '\'' +
", psQcflg='" + psQcflg + '\'' +
", ps='" + ps + '\'' +
", paQcflg='" + paQcflg + '\'' +
", pa='" + pa + '\'' +
", td='" + td + '\'' +
", pv='" + pv + '\'' +
", hmQcflg='" + hmQcflg + '\'' +
", hm='" + hm + '\'' +
", wdQcflg='" + wdQcflg + '\'' +
", wd='" + wd + '\'' +
", wsQcflg='" + wsQcflg + '\'' +
", ws='" + ws + '\'' +
", rnQcflg='" + rnQcflg + '\'' +
", rn='" + rn + '\'' +
", taQcflg='" + taQcflg + '\'' +
", ta='" + ta + '\'' +
", stnNm='" + stnNm + '\'' +
", stnId='" + stnId + '\'' +
", rnum='" + rnum + '\'' +
", tm='" + tm + '\'' +
'}';
}
}
public static class Header {
@JsonProperty("resultMsg")
private String resultMsg;
@JsonProperty("resultCode")
private String resultCode;
public String getResultMsg() {
return resultMsg;
}
public void setResultMsg(String resultMsg) {
this.resultMsg = resultMsg;
}
public String getResultCode() {
return resultCode;
}
public void setResultCode(String resultCode) {
this.resultCode = resultCode;
}
}
}
2. 데이터 받을 서비스 코드 작성
* 여기서 URLEncoder 부분 'dataCd, dateCd ,startDt ,startHh ,endDt, endHh'를 활용하여 데이터 기간을 변경할 수 있습니다. 이 글에서는 하루씩 받기 위해서 소스코드가 작성되어 있으니, 필요에 따라 변형해서 사용하시면 될거 같습니다.
@Service
public class WeatherService {
public String serviceKey = "서비스키 입력";
/**
*
* @param year 시작 년도
* @param month 시작 달
* @param day 시작 일
* @return
* @throws IOException
*/
public List<WthrHourDto.Item> getWthrDataListHour(String year, String month, String day) throws IOException {
LocalDate startDt = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); // 시작일
String strStartDt = startDt.format(DateTimeFormatter.ofPattern("yyyyMMdd")); // ex) 20220410
LocalDate endDt = startDt.plusDays(1);
String strEndDt = endDt.format(DateTimeFormatter.ofPattern("yyyyMMdd"));// ex) 20220411
StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1360000/AsosHourlyInfoService/getWthrDataList"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + serviceKey); /*Service Key*/
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호 Default : 10*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("24", "UTF-8")); /*한 페이지 결과 수 Default : 1*/
urlBuilder.append("&" + URLEncoder.encode("dataType", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /*요청자료형식(XML/JSON) Default : XML*/
urlBuilder.append("&" + URLEncoder.encode("dataCd", "UTF-8") + "=" + URLEncoder.encode("ASOS", "UTF-8")); /*자료 분류 코드(ASOS)*/
urlBuilder.append("&" + URLEncoder.encode("dateCd", "UTF-8") + "=" + URLEncoder.encode("HR", "UTF-8")); /*날짜 분류 코드(HR)*/
urlBuilder.append("&" + URLEncoder.encode("startDt", "UTF-8") + "=" + URLEncoder.encode(strStartDt, "UTF-8")); /*조회 기간 시작일(YYYYMMDD)*/
urlBuilder.append("&" + URLEncoder.encode("startHh", "UTF-8") + "=" + URLEncoder.encode("00", "UTF-8")); /*조회 기간 시작시(HH)*/
urlBuilder.append("&" + URLEncoder.encode("endDt", "UTF-8") + "=" + URLEncoder.encode(strEndDt, "UTF-8")); /*조회 기간 종료일(YYYYMMDD) (전일(D-1) 까지 제공)*/
urlBuilder.append("&" + URLEncoder.encode("endHh", "UTF-8") + "=" + URLEncoder.encode("00", "UTF-8")); /*조회 기간 종료시(HH)*/
urlBuilder.append("&" + URLEncoder.encode("stnIds", "UTF-8") + "=" + URLEncoder.encode("108", "UTF-8")); /*종관기상관측 지점 번호 (활용가이드 하단 첨부 참조)*/
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()));
}
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
String json = sb.toString();
WthrHourDto wthrHourDto = new ObjectMapper().readValue(json, WthrHourDto.class);
// System.out.println("wthrHourDto.getResponse().getBody().getNumOfRows() = " + wthrHourDto.getResponse().getBody().getNumOfRows());
// System.out.println("wthrHourDto.getResponse().getBody().getTotalCount() = " + wthrHourDto.getResponse().getBody().getTotalCount());
List<WthrHourDto.Item> items = wthrHourDto.getResponse().getBody().getItems().getItem();
System.out.println("wthrHourDto.getResponse().getBody().getItems().getItem() = " + items);
for (WthrHourDto.Item item : items) {
System.out.println("item = " + item);
}
return items;
}
}
3. Controller 작성
@RestController
public class WeatherAPIController {
private final WeatherService weatherService;
public WeatherAPIController(WeatherService weatherService) {
this.weatherService = weatherService;
}
@GetMapping("wthrhour")
public ResponseEntity wthrhour(
@PathParam("year") String year,
@PathParam("month") String month,
@PathParam("day") String day
) {
List<WthrHourDto.Item> wthrDataListHour = null;
try {
wthrDataListHour = weatherService.getWthrDataListHour(year,month,day);
} catch (IOException e) {
e.printStackTrace();
}
return ResponseEntity.ok().body(wthrDataListHour);
}
}
4. 결과화면
'[Spring] > springboot' 카테고리의 다른 글
[SpringBoot] 멀티 데이터베이스(DB) 설정하기 JPA 편 (1) | 2022.05.22 |
---|---|
[SpringBoot] 멀티 데이터베이스 설정하기 - Gradle 설정편 (0) | 2022.05.22 |
[공공데이터활용] 공휴일 정보 가져오기(JAVA 버전) (0) | 2022.04.06 |
[SpringBoot] RestAPI 파일업로드 - 2 (0) | 2022.02.24 |
[SpringBoot] RestAPI 파일업로드 - 1 (0) | 2022.02.24 |