티스토리 뷰

목차


    반응형

    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") + "도 입니다.");
    
        }
    }

     

     

    반응형