# 사전준비: 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. 결과화면

 

블로그 이미지

미나미나미

,

# OpenAPI 키 발행: https://www.data.go.kr/data/15012690/openapi.do 

# 서비스 키를 발급 받아야합니다.


# 프로젝트 구조

- ApiController.java

- RequestUtils.java 

 

1. 공공데이터에서 제공해주는 Java 버전의 API를 살짝 각색합니다.

  Year과 Month를 넣는 부분과 Json 형식으로 요청합니다.

2. Json으로 받은 데이터를 Hashmap으로 변환합니다.

# 1번과 2번 소스코드

private static String secretKey = "서비스키";
    
    public static Map<String, Object> holidayInfoAPI(String year, String month) throws IOException {
        StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo"); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + secretKey); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("solYear", "UTF-8") + "=" + URLEncoder.encode(year, "UTF-8")); /*연 */
        urlBuilder.append("&" + URLEncoder.encode("solMonth", "UTF-8") + "=" + URLEncoder.encode(month.length() == 1 ? "0" + month : month, "UTF-8")); /*월*/
        urlBuilder.append("&" + URLEncoder.encode("_type", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /* json으로 요청 */

        URL url = new URL(urlBuilder.toString());
        System.out.println("요청URL = " + urlBuilder);

        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();
        // System.out.println(sb.toString());

        return string2Map(sb.toString());
    }

    /**
     * Json String을 Hashmap으로 반환
     *
     * @param json
     * @return
     */
    public static Map<String, Object> string2Map(String json) {
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> map = null;

        try {
            map = mapper.readValue(json, Map.class);
            System.out.println(map);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return map;
    }

3. Controller 구성

* 공휴일 요청 후, 세 가지의 응답을 받게 됩니다.

  1. 공휴일이 없는 경우 

  2. 공휴일 하루 있는 경우

  3. 공휴일 이틀 이상인 경우

 

 

   @GetMapping("holidayInfoAPI")
    public ResponseEntity holidayInfoAPI(
            @PathParam("year") String year,
            @PathParam("month") String month
    ) {

        System.out.println("year = " + year);
        System.out.println("month = " + month);

        ArrayList<HashMap> responseHolidayArr = new ArrayList<>();

        try {
            Map<String, Object> holidayMap = RequestUtils.holidayInfoAPI(year, month);
            Map<String, Object> response = (Map<String, Object>) holidayMap.get("response");
            Map<String, Object> body = (Map<String, Object>) response.get("body");
            System.out.println("body = " + body);

            int totalCount = (int) body.get("totalCount");
            if (totalCount <= 0) {
                System.out.println("공휴일 없음");
            }
            if (totalCount == 1) {
                HashMap<String, Object> items = (HashMap<String, Object>) body.get("items");
                HashMap<String, Object> item = (HashMap<String, Object>) items.get("item");
                responseHolidayArr.add(item);
                System.out.println("item = " + item);
            }
            if (totalCount > 1) {
                HashMap<String, Object> items = (HashMap<String, Object>) body.get("items");
                ArrayList<HashMap<String, Object>> item = (ArrayList<HashMap<String, Object>>) items.get("item");
                for (HashMap<String, Object> itemMap : item) {
                    System.out.println("itemMap = " + itemMap);
                    responseHolidayArr.add(itemMap);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.ok().body(responseHolidayArr);
    }

4. 결과 화면

 

 

 

 

블로그 이미지

미나미나미

,