The New 나만의 Weather 만들기 프로젝트 - (2)

2024. 12. 8. 19:05Spring-Project

 

 

이전글

https://codepracticeroom.tistory.com/228

 

The New 나만의 Weather 만들기 프로젝트 - (1)

실행환경- Mac os- Java17- SpringBoot 3.4.0- Intellij  Weather 완성모습     오늘의 날씨 + 앞으로의 6일의 날씨 에측 데이터를 API로 불러서 웹 사이트에 뿌릴 것이다. 먼저 공공데이터포털에서 단기예보

codepracticeroom.tistory.com

 

 

 

 

실행환경

- Mac os

- Java17

- SpringBoot 3.4.0

- Intellij 

 

 

이번에는 중기예보를 알아볼 것이다.

 

저번 포스팅에 만들었던 단기예보 myWeather의 @Component와 @PostConstruct는 잠시 주석처리를 하고 새로운 패키지를 만들어야 한다.

 

weather_test 패키지 아래에 mid_weather 패키지를 만들고 WeatherMidTest 클래스를 하나 만들어 준다.

 

먼저 필요한 코드가 2개 있다.

중기육상예보코드는 중기예보 문서 아래쪽에 보면 알 수 있다 (아래 사진 참고)

나의 현재 위치는 경기도에 있으므로 11B00000를 선택했다

 

그 다음으로 중기기온코드가 필요하다 (중기예보_중기기온예보구역코드 엑셀 참고)

현재 위치가 성남이므로 11B20605를 복사하였다  

 

 

필요한 코드들을 복사 후 properties에 붙여넣는다

# 중기예보 육상예보구역 코드 - 경기도
my.weather.mid.landArea = 11B00000

# 중기예보 기온조회구역 코드 - 성남시
my.weather.mid.tempArea = 11B20605

 

서비스키는 단기예보와 중기예보와 같으므로 하나만 있으면 된다.

 

 

 

이제 공공데이터포털에 있는 자바 예제를 만들었던 WeatherMidTest에 붙여 넣는다.

 

중기예보에서 가져올 데이터는 육상예보, 기온조회 이다. 이것들은 stnId 대신 regId를 사용한다.

그러므로  붙여넣은 코드 중에서 stnId는 필요없다.

이 부분을 regId로 변경해주자, 그리고 108번이 아니라 자신의 위치 육상예보구역 코드를 붙여 넣자

urlBuilder.append("&" + URLEncoder.encode("stnId","UTF-8") + "=" + URLEncoder.encode("108", "UTF-8"));

----->>>>>>>>>

urlBuilder.append("&" + URLEncoder.encode("regId","UTF-8") + "=" + URLEncoder.encode("11B00000", "UTF-8"));

 

 

 

그 아래 tmFc는 현재날짜 + 시간을 넣어줘야 한다

중기예보는 하루 2번 06시, 18시 2번 데이터를 제공하므로 둘 중 하나를 넣어야 한다

 // 오늘 날짜를 yyyyMMdd 형식으로 가져온다
    LocalDateTime date = LocalDateTime.now();
    String currentDate = DateTimeFormatter.ofPattern("yyyyMMdd").format(date);

    String currentDateTime = currentDate + "0600";		// 예시로 06시 넣음
    
    ...
    
            /* 일 2회(06:00,18:00)회 생성
        현재날짜 + 현재시간 "yyyyMMddHH00"*/
        urlBuilder.append("&" + URLEncoder.encode("tmFc","UTF-8") + "=" + URLEncoder.encode(currentDateTime, "UTF-8"));

 

 

/* URL */ 아래 부분에 육상예보코드를 넣고 실행하면 육상에보 날씨 데이터가 나온다.

 

 

위 부분을 기온조회구역 코드로 바꾸고 regId에 기온조회구역 코드를 넣으면 기온이 나온다.

 

 

전체코드

@Component
@Slf4j
public class WeatherMidTest {

    //Value로 properties에 있는 나의 servicekey를 가져온다
    @Value("${my.weather.servicekey}")
    private String serviceKey;

    @Value("${my.weather.mid.getMidLandFcst}")
    private String midLandFcst;

    @Value("${my.weather.mid.getMidTa}")
    private String midTa;

    // 오늘 날짜를 yyyyMMdd 형식으로 가져온다
    LocalDateTime date = LocalDateTime.now();
    String currentDate = DateTimeFormatter.ofPattern("yyyyMMdd").format(date);
    String currentTime = DateTimeFormatter.ofPattern("HH").format(date)+"00";

    String currentDateTime = currentDate + "0600";


    @PostConstruct
    public void myWeather() throws IOException {

        /*URL*/
        // 육상예보 or 기온조회
        StringBuilder urlBuilder = new StringBuilder(midLandFcst);
        /*Service Key*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + serviceKey);
        /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8"));
        /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("1000", "UTF-8"));
        /*요청자료형식(XML/JSON) JSON */
        urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode("JSON", "UTF-8"));
        /* 기온은 중기예보_중기기온예보구역코드 엑셀 참고*/
        urlBuilder.append("&" + URLEncoder.encode("regId","UTF-8") + "=" + URLEncoder.encode("11B00000", "UTF-8"));
        /* 일 2회(06:00,18:00)회 생성
        현재날짜 + 현재시간 "yyyyMMddHH00"*/
        urlBuilder.append("&" + URLEncoder.encode("tmFc","UTF-8") + "=" + URLEncoder.encode(currentDateTime, "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();
        System.out.println(sb.toString());
    }
}