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