Spring-Project

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

youngbee 2024. 12. 7. 17:20

실행환경

- Mac os

- Java17

- SpringBoot 3.4.0

- Intellij 

 

Weather 완성모습

 

 

 

 

오늘의 날씨 + 앞으로의 6일의 날씨 에측 데이터를 API로 불러서 웹 사이트에 뿌릴 것이다.

 

먼저 공공데이터포털에서 단기예보, 중기예보 API 사용을 신청해야 한다.

 

https://www.data.go.kr/

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

 

 

로그인을 한 후 단기예보 검색 - 오픈API 클릭 - 기상청_단기예보 ((구)_동네예보) 조회서비스 선택

(아래 링크와 동일)

https://www.data.go.kr/data/15084084/openapi.do

 

기상청_단기예보 ((구)_동네예보) 조회서비스

초단기실황, 초단기예보, 단기((구)동네)예보, 예보버전 정보를 조회하는 서비스입니다. 초단기실황정보는 예보 구역에 대한 대표 AWS 관측값을, 초단기예보는 예보시점부터 6시간까지의 예보를,

www.data.go.kr

 

 

 

https://www.data.go.kr/data/15059468/openapi.do

 

기상청_중기예보 조회서비스

중기전망, 중기육상예보, 중기기온, 중기해상예보 정보를 조회하는 서비스

www.data.go.kr

 

 

 

활용 신청을 클릭하면 잠시 후 승인이 나고 신청한 인증키를 받을 수 있다.

 

 

 

중기예보 또한 마찬가지 이다.

 

 

위 빨간색 박스 부분이 필요한 서비스 API Key 이다.

 

 

API 키를 발급 받았으면 이제 스프링부트 프로젝트를 시작하면 된다.

https://start.spring.io/

 

 

 

필요한 의존성은 스프링 웹, 타임리프, 롬복이다.

 

파일을 다운 받은 후 압축을 풀어 인텔리제이로 build.gradle를 클릭하여 프로젝트를 열어준다.

 

필요한 데이터 정보는 아래 링크를 참고

https://codepracticeroom.tistory.com/207

 

기상청API를 활용한 나만의 Weather 만들기(2) - 기상청API 데이터 분석

이전글https://codepracticeroom.tistory.com/206 기상청API를 활용한 나만의 Weather 만들기(1)JAVA :17개발 OS : WindowIDE : IntelliJ  기상청 API를 활용하여 날씨 정보를 실시간으로 확인하고  일주일 예상 날씨를

codepracticeroom.tistory.com

 

 

 

 

먼저 필요한 Key를 properties에 넣는다.

클래스에서 필요할 때 @Value로 불러 사용할 수 있다

 

 

application.properties

spring.application.name=wehater-test


my.weather.servicekey = 서비스 API 키

# 초단기실황조회
my.weather.sht.getUltraSrtNcst = http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst

# 초단기예보조회
my.weather.sht.getUltraSrtFcst = http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst

# 단기예보
my.weather.sht.getVilageFcst = http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst

# 중기육상예보조회
my.weather.mid.getMidLandFcst = http://apis.data.go.kr/1360000/MidFcstInfoService/getMidLandFcst

# 중기기온조회
my.weather.mid.getMidTa = http://apis.data.go.kr/1360000/MidFcstInfoService/getMidTa

 

먼저 단기예보가 잘 오는지 확인을 위해 weather-test 패키지 아래에 sht_weather 라는 패키지를 만들고 weatherShtTest를 만든다.

 

 

 그 후 단기예보에 있는 자바 예제코드를 복사하여 넣는다.

 

 

weatherShtTest

@Component
@Slf4j
public class WeatherShtTest {

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

    // 초단기실황
    //Value로 properties에 있는 나의 getUltraSrtNcst(초단기실황) 가져온다
    // 현재 날씨 가져옴 (1시간 단위)
    @Value("${my.weather.sht.getUltraSrtNcst}")
    private String ultraSrtNcst;

    // 초단기예보
    //Value로 properties에 있는 나의 getUltraSrtFcst(초단기예보) 가져온다
    // 현재시간의 + 6시간 이내 데이터 가져옴 ( 5개 )
    @Value("${my.weather.sht.getUltraSrtFcst}")
    private String ultraSrtFcst;


    // 단기예보
    //Value로 properties에 있는 나의 getVilageFcst(단기예보) 가져온다
    // 1 ~ 3, 4일 이내 데이터를 가져옴
    @Value("${my.weather.sht.getVilageFcst}")
    private String vilageFcst;


    // 단기예보
    @PostConstruct
    public void myWeather() throws IOException {

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

        /*
        단기예보 발표시각
        - Base_time : 0200, 0500, 0800, 1100, 1400, 1700, 2000, 2300 (1일 8회)
        - API 제공 시간(~이후) : 02:10, 05:10, 08:10, 11:10, 14:10, 17:10, 20:10, 23:10
        */


        /* URL */
        StringBuilder urlBuilder = new StringBuilder(vilageFcst);
        /* 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"));
        /* 현재 시간  currentDate */
        urlBuilder.append("&" + URLEncoder.encode("base_date", "UTF-8") + "=" + URLEncoder.encode(currentDate, "UTF-8"));
        /* 06시 발표(정시단위) */
        urlBuilder.append("&" + URLEncoder.encode("base_time", "UTF-8") + "=" + URLEncoder.encode("1400", "UTF-8"));
//        urlBuilder.append("&" + URLEncoder.encode("base_time", "UTF-8") + "=" + URLEncoder.encode(currentTime, "UTF-8"));

        // x, y 값은 단기예보 " 기상청41_단기예보 조회서비스_오픈API활용가이드_격자_위경도(20240101) " 엑셀 파일 참고
        // 62, 122 성남시 구미동 x,y 값
        /* 예보지점의 X 좌표값 */
        urlBuilder.append("&" + URLEncoder.encode("nx", "UTF-8") + "=" + URLEncoder.encode("62", "UTF-8"));
        /* 예보지점의 Y 좌표값 */
        urlBuilder.append("&" + URLEncoder.encode("ny", "UTF-8") + "=" + URLEncoder.encode("122", "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());
    }
}

 

 

받은 Json 데이터

 

초단기 실황, 초단기 예보는 현재시간이 가능하지만 

단기예보는  0200, 0500, 0800, 1100, 1400, 1700, 2000, 2300 1일 8회 업데이트가 되며, 
02:10, 05:10, 08:10, 11:10, 14:10, 17:10, 20:10, 23:10 시간 이후 API를 제공해 준다.

 

X, Y 의 값은 단기예보 엑셀 파일을 참고하면 된다.

 

현재 날씨는 초단기 실황, 앞으로의 6시간 이내 날씨는 초단기예보, 나머지 ~ 3일의 날씨는 단기예보에서 가져오면 된다.