Loading...

공공 데이터/실습 / / 2022. 1. 26. 15:35

날씨 공공데이터 실습

반응형

ResponseDto.java

package weathertest;

import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Data;

@AllArgsConstructor
@Data
public class ResponseDto {
    private Response response;

    @AllArgsConstructor
    @Data
    class Response {
        private Header header;
        private Body body;

        @AllArgsConstructor
        @Data
        class Header {
            private String resultCode;
            private String resultMsg;
        }

        @AllArgsConstructor
        @Data
        class Body {
            private String dataType;
            private Items items;
            private int pageNo;
            private int numOfRows;
            private int totalCount;

            @AllArgsConstructor
            @Data
            class Items {
                private List<Item> item;

                @AllArgsConstructor
                @Data
                class Item {
                    private String baseDate;
                    private String baseTime;
                    private String category;
                    private int nx;
                    private int ny;
                    private String obsrValue;
                }
            }
        }
    }
}

 

 

DownloadWeather.java

package weathertest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;

import weathertest.ResponseDto.Response.Body.Items.Item;

public class DownloadWeather {
    public static Map<String, String> getWeatherList(String baseDate, String baseTime) {    // 날짜와 시간데이터를 받아와, url의 쿼리 스트링 값 바꿔주기
        Map<String, String> weatherMap = new HashMap<>();   // 날씨코드와 온도를 뽑아낼 Map 선언

        try {
            URL url = new URL(
                    "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst?serviceKey=090tbpV1s%2F%2F2YJxMEkGWsGycvC6GQRKrIXFNzkv44vZejXWfuwu0yzNcVUOUEnn5QgU9fXb9yuJfArubBmvWpg%3D%3D&pageNo=1&numOfRows=1000&dataType=JSON&base_date="
                            + baseDate + "&base_time=" + baseTime + "&nx=97&ny=75&type=json");

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();  // 선 연결

            BufferedReader br = new BufferedReader( // 읽어오기
                    new InputStreamReader(conn.getInputStream(), "utf-8"));

            String responseJson = br.readLine();    // 버퍼 비우기
            Gson gson = new Gson();
            ResponseDto responseDto = gson.fromJson(responseJson, ResponseDto.class);   // json -> 자바 오브젝트로 옮기기

            List<Item> result = responseDto.getResponse().getBody().getItems().getItem();   // 받아온 데이터를 list에 옮기기

            for (int i = 0; i < result.size(); i++) {
                weatherMap.put(result.get(i).getCategory(), result.get(i).getObsrValue());  // map에 날씨코드:온도 저장
            }

            return weatherMap;  // map 리턴

        } catch (Exception e) {
            System.out.println("주소 입력이 잘못되었습니다.");
        }

        return null;
    }
}

 

 

MainApp.java

package weathertest;

import java.util.Map;
import java.util.Scanner;

public class MainApp {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // baseDate, obsrValue, category
        System.out.println("==부산 진구의 날씨를 출력합니다.==");
        System.out.println("======오늘 날짜를 입력하세요======");
        System.out.println("ex ) 20220126");

        String baseDate = sc.nextLine();
        // baseDate가 8자가 아니면 프로그램을 종료한다.
        if (baseDate.length() != 8) {
            System.out.println("날짜를 잘못 입력하셨습니다.");
            System.exit(0);
        }

        System.out.println("======현재 시간을 입력하세요======");
        System.out.println("ex ) 0900 (정시단위)");

        String baseTime = sc.nextLine();
        // baseTime 4자가 아니면 프로그램을 종료한다.
        if (baseTime.length() != 4) {
            System.out.println("시간을 잘못 입력하셨습니다.");
            System.exit(0);
        }

        // 만들어둔 메서드에 날짜와 시간 넣고 map 리턴받기
        Map<String, String> weatherMap = DownloadWeather.getWeatherList(baseDate, baseTime);    

        // map에서 키 "T1H"를 입력하여 온도값 얻어오기
        System.out.println("부산 진구의 현재 온도는 " + weatherMap.get("T1H") + "도 입니다.");

    }
}

 

 

반응형