Spring/[P] 눈치우기 봉사활동 매칭 플랫폼

OpenWeatherMap API 로 매일 날씨 정보 가져오기

alsruds 2024. 2. 20. 09:58

 

❄️눈이 오는 날만 알림 문구 생성❄️

 

☃️ OpenWeatherMap Key 발급받는 법

1. https://home.openweathermap.org/ 홈페이지 접속

2. 로그인 후 My API keys 찾기

 

3. Create Key 로 새로운 키 생성하기 (API key name 작성 후 → Generate)

Key 칸에 생성된 key 값이 표시된다

 

☃️ 프로젝트에 발급받은 Key 등록하기

· application.properties

# openweathermap api
api.key=[발급받은 api 키]

 

☃️ JSON 파싱을 위한 dependencies 등록하기

· build.gradle

...
dependencies {
	...
	// json parsing
	implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
}
...

 

☃️ 코드 작성하기

❄️ Api Key 환경 변수 세팅

@Value("${api.key}")
private String apiKey;

 

❄️ 매일 실행 : @Scheduled 사용

// 매일 아침 9시에 실행
@Scheduled(cron = "0 0 9 * * ?")
public void callWeather() throws IOException { ... }

 

❄️ OpenWeatherMap API connection 생성

URL url = new URL("https://api.openweathermap.org/data/2.5/weather?lat="+user.getLatitude()+"&lon="+user.getLongitude()+"&appid="+ apiKey);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
conn.setDoOutput(true);

 

❄️ 정보 불러오기

try {
    StringBuffer sb = new StringBuffer();
    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    while(br.ready()) {
        sb.append(br.readLine());
    }
    ...
} catch (Exception e) { e.printStackTrace(); }

 

❄️ 불러온 정보 파싱

JSONParser parser = new JSONParser();
JSONObject data = (JSONObject)parser.parse(sb.toString());
JSONArray weather = (JSONArray) data.get("weather");
JSONObject weather_info = (JSONObject) weather.get(0);

// weather main 종류 : Thunderstorm, Drizzle, Rain, Snow, Atmosphere, Clear, Clouds
String todaysWeather = (String) weather_info.get("main");
String weatherDescription = (String) weather_info.get("description");

 

❄️ 눈이 오는 날만 알림 생성

if (todaysWeather.equals("Snow")) {
    System.out.println("weather : " + todaysWeather);
    System.out.println("description : " + weatherDescription);
    System.out.println("눈치우기 봉사활동을 할 수 있는 날이에요");
}

 

🌈 전체 코드

@Component
@RequiredArgsConstructor
public class WeatherAPI {
    private final UserRepository userRepository;

    @Value("${api.key}")
    private String apiKey;

    // 매일 아침 9시에 실행
    @Scheduled(cron = "0 0 9 * * ?")
    public void callWeather() throws IOException {
        List<User> users = userRepository.findByWeatherAlarmIsTrue();

        for (User user : users) {
            try {
                // OpenWeatherMap API connection
                URL url = new URL("https://api.openweathermap.org/data/2.5/weather?lat="+user.getLatitude()+"&lon="+user.getLongitude()+"&appid="+ apiKey);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Content-type", "application/json");
                conn.setDoOutput(true);

                // 정보 가져오기
                try {
                    StringBuffer sb = new StringBuffer();
                    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                    while(br.ready()) {
                        sb.append(br.readLine());
                    }

                    // 가져온 정보 파싱
                    JSONParser parser = new JSONParser();
                    JSONObject data = (JSONObject)parser.parse(sb.toString());
                    JSONArray weather = (JSONArray) data.get("weather");
                    JSONObject weather_info = (JSONObject) weather.get(0);

                    // weather main 종류 : Thunderstorm, Drizzle, Rain, Snow, Atmosphere, Clear, Clouds
                    String todaysWeather = (String) weather_info.get("main");
                    String weatherDescription = (String) weather_info.get("description");

                    // 눈이 올 때만 알림 주기
                    if (todaysWeather.equals("Snow")) {
                        System.out.println("weather : " + todaysWeather);
                        System.out.println("description : " + weatherDescription);
                        System.out.println("눈치우기 봉사활동을 할 수 있는 날이에요");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

· 알람을 받고 싶어하는 유저만 걸러내기 : findByWeatherAlarmIsTrue