์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ! ํ
๋ ๊ทธ๋จ์ฉ ๋ด์ ๋ง๋๋ ์ฃผ์ ๋ ๋ค์ ํ๋ํ๊ณ ๋ง์ ๊ฐ์ด๋๊ฐ ์์ฑ๋์์ต๋๋ค(์: ์ด ๊ฐ์ด๋ ). ๋ฐ๋ผ์ ์ผ๋ถ ํ์ฌ API ์์
์ ๋ํด ์์ธํ ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๋ชจ๋ ์น ๊ฐ๋ฐ์์๊ฒ ์ค์ํ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ์ฅ ๊ธฐ๋ฅ์ ์ด๊ณ ์ ์ฉํ ์์ธก์ ์ ๊ณตํ๊ธฐ ์ํด ์์๋ ๊ฒ์ด ์๋๋ฉฐ, ๊ธฐ์ ์ฌ์ดํธ์ ๊ฒฝ์ํ ์ด์ ๊ฐ ์์ผ๋ฉฐ, Java๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์ฐ๊ฒฐ ๋ฐ ๋ฐ์ดํฐ ๊ตฌ๋ฌธ ๋ถ์ ์์
๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์ค์ํ์ต๋๋ค. ๊ทธ๋ผ ๋จผ์ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ ๊ฐ์ง ๋
ผ๋ฆฌ์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์ฌ์ฉ์์ ๋ฉ์์ง ์๋ฝ
- ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ ํจํ ๋ช ๋ น์ธ ๊ฒฝ์ฐ ์๋ต์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ฌ๋ฐ๋ฅธ ๋์๋ฅผ ์ ๋ ฅํ๋ฉด ์ผ๊ธฐ ์๋ณด๋ฅผ ์ค๋นํฉ๋๋ค.
- ์ฑํ ์์ ์ฌ์ฉ์์๊ฒ ์ค๋น๋ ์ ๋ณด๋ฅผ ๋ณด๋ ๋๋ค.
https://api.openweathermap.org/data/2.5/forecast?q=(ะณะพัะพะด)&APPID=(ัะฝะธะบะฐะปัะฝัะน ัะพะบะตะฝ, ะฟะพะปััะตะฝะฝัะน ะฟัะธ ัะตะณะธัััะฐัะธะธ)
์ด๋ฌํ ์์ฒญ์ ๋ํ ์๋ต์ด ๋ธ๋ผ์ฐ์ ์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ ์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๊ธฐ๋ง ํ๋ฉด ์๋ฒ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ์ด๋ฏธ ์๊ณ ์์ต๋๋ค. ๋จ์ ๊ฒ์ Java๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์
๋๋ค. Java์ ๊ฐ๋จํ GET ์์ฒญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
//ัะพะทะดะฐัะผ ัััะพะบั ัะพ ัััะปะบะพะน ะฝะฐ ะฝัะถะฝัั page,
//ั ััั ะตั ัะบะปะตะธะฒะฐั ะธะท ะทะฐัะฐะฝะตะต ะพะฟัะตะดะตะปัะฝะฝัั
ะบะพะฝััะฐะฝั, ะผะตะฝัั ัะพะปัะบะพ ัะฐะผ ะณะพัะพะด
String urlString = API_CALL_TEMPLATE + city + API_KEY_TEMPLATE;
//ัะพะทะดะฐัะผ an object ะบะพัะพััะน ะฑัะดะตั ัะพะดะตัะถะฐัั ัััะปะบั
URL urlObject = new URL(urlString);
//ัะพะทะดะฐัะผ ัะพะตะดะธะฝะตะฝะธะต, ะธัะฟะพะปัะทัั an object
HttpURLConnection connection = (HttpURLConnection) urlObject.openConnection();
//ะฒัะฑะธัะฐะตะผ ัะธะฟ requestะฐ (GET)
connection.setRequestMethod("GET");
//ััั ะผั ัะบะฐะทัะฒะฐะตะผ, ะดะฐะฝะฝัะต ะพ ัะตะฑะต, ััะพ ะผั ะผะพะถะตะผ ะฟัะธะฝััั ะฒัั ัะพ,
//ััะพ ะฟัะธะผะตั ะธ ะปัะฑะพะน ัะพะฒัะตะผะตะฝะฝัะน ะฑัะฐัะทะตั
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
//ะ ะฝะฐัะฐะปะพ ะพัะฒะตัะฐ server ะฒัะตะณะดะฐ ะฒััะฐะฒะปัะตั ัะธัะปะพ, ะฟะพ ะบะพัะพัะพะผั ะผะพะถะฝะพ ััะดะธัั, ะฟัะพัะปะพ ะปะธ ะฒัั ั
ะพัะพัะพ.
//200 - ะทะฝะฐัะธั OK
int responseCode = connection.getResponseCode();
//ะฝะฐ ะฝะตัััะตััะฒัััะธะน ะณะพัะพะด or ะณะพัะพะด ั ะพะฟะตัะฐัะบะพะน, server ะฒัะดะฐัั code ะพัะฒะตัะฐ 404,
//ะฑัะพัะฐะตะผ ะฝะฐ ะฝะตะณะพ ะธัะบะปััะตะฝะธะต, ััะพะฑั ะพะฑัะฐะฑะพัะฐัั ะฝะฐ ััะพะฒะฝะต ะฟะพะฒััะต ะธ ะฟัะตะดะปะพะถะธัั
//ะฟะพะปัะทะพะฒะฐัะตะปั ะฒะฒะตััะธ ะณะพัะพะด ะทะฐะฝะพะฒะพ
if (responseCode == 404) {
throw new IllegalArgumentException();
}
// ัะพะทะดะฐัะผ ะฟะพัะพะบ, ะฒััะธััะฒะฐะตะผ ะฒัะต ัััะพะบะธ, ะธ ัะบะปะตะธะฒะฐะตะผ ะฒ ะพะดะฝั ะฑะพะปัััั ัััะพะบั,
//ะบะพัะพััั ะฑัะดะตะผ ะฟะพัะพะผ ะพะฑัะฐะฑะฐััะฒะฐัั ะฒ ะดััะณะธั
ะผะตัะพะดะฐั
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
์์ฒญ์ด ์ ํํ๊ณ ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ ์ฉํ ์ ๋ณด์ ํ์ฌ ํ์ํ์ง ์์ ์ ๋ณด๊ฐ ํผํฉ๋ ๋ฐ์ดํฐ ์ํธ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค. JSON ๋ฐ XML์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ถ์ถํ๊ธฐ ์ํด ๋ชจ๋ ์ทจํฅ์ ๋ง๊ฒ Java์ฉ์ผ๋ก ์๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฑ๋์์ต๋๋ค. ์ ๋ JSON์ ์ ํธํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Jackson์ด๋ผ๋ ๋งค์ฐ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ต๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , JavaRush์์๋ ์ผ๋ถ ๋์ ์์ค์์ ์ฝ๊ฐ ์ฐ๊ตฌ๋์์ต๋๋ค. ๋๋์ JSON ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ฌธ์์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด์ ๊ฐ์ ์ ์ฉํ ์ฌ์ดํธ๊ฐ ๋์ ์ด ๋ฉ๋๋ค . ์ผ์ชฝ์๋ ์๋ณธ JSON์ด ์๊ณ ์ค๋ฅธ์ชฝ์๋ ๊ตฌ์กฐํ๋ JSON์ด ์์ต๋๋ค. ์๋ต์ 5๊ฐ์ ์ต์์ JSON ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๊ทธ ์ค 2๊ฐ๋ ๋ณต์กํ๊ณ ๋ค์ ๋ถ๊ธฐ์ ๋ํ ๋
ธ๋์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ ์๋ ๋ฐ์ดํฐ๋ ๋ชฉ๋ก ๋
ธ๋์ ์ ์ฅ๋ฉ๋๋ค . ๋ด๋ถ ๋ชฉ๋ก์ ๊ฐ๊ฐ ํน์ ์๊ฐ์ ๋ ์จ๋ฅผ ์ค๋ช
ํ๋ 38๊ฐ์ JSON ๋ผ์ธ ๋ฐฐ์ด์
๋๋ค. ์ฆ, ๋ฟ๋ฆฌ, ๊ฐ์ง, ์๊ฐ์ง, ์ฌ์ง์ด ์๊น์ง ์๋ ์ผ์ข
์ ๋๋ฌด์ ๊ฐ์ ๊ตฌ์กฐ์
๋๋ค. :) ๊ทธ๋ฆฌ๊ณ ๋
ธ๋์์ ๋ถ๊ธฐ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ์ข๊ฒ๋ Jackson์ ์ ํจํ JSON์ ํธ๋ฆฌ๋ก ํํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ํ ์์ฑ์ ์ด๋ฆ(์: ๊ธฐ์จ)๊ณผ ํด๋น ์์ฑ์ด ๋๋ฌด์ ์ด๋ ์์ค์ ์๋์ง ์๋ฉด ์ด๋ฅผ ์ป๋ ๋ฐ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋จผ์ "๋ชฉ๋ก" ๋ฐฐ์ด์์ ๋ชจ๋ ํ์ ์ถ์ถํ์ฌ ๋ณ๋์ ๋ชฉ๋ก์ ์ถ๊ฐํ์ต๋๋ค. ๋๋ต์ ์ผ๋ก ๋งํ๋ฉด ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ํธ๋ฅผ ์กฐ๊ฐ์ผ๋ก ์๋ผ๋๋๋ฐ, ๊ฐ ์กฐ๊ฐ์ ๋ณ๋์ ์์ธก์
๋๋ค. ์์ ๋ถํ์ ๊ธฐ์ตํ๊ณ ์กฐ์ํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
//JsonNode - ััะพ ะพะดะธะฝ ะธะท ัะทะปะพะฒ ะฒ ะดัะตะฒะพะฒะธะดะฝะพะน ะธะตัะฐัั
ะธะธ, ะพั ะบะพัะพัะพะณะพ ะธะดัั ะฒะตัะฒะธ
//ะฟะพะปััะฐะตะผ ัะทะตะป, ะบะพัะพััะน ะฝะฐะทัะฒะฐะตััั "list"
JsonNode arrNode = new ObjectMapper().readTree(data).get("list");
//ะตัะปะธ ััะพ ะดะตะนััะฒะธัะตะปัะฝะพ ะผะฐััะธะฒ ัะทะปะพะฒ
if (arrNode.isArray()) {
//ะฒัะฟะพะปะฝัะตะผ ะดะปั ะบะฐะถะดะพะณะพ ัะทะปะฐ, ะบะพัะพััะน ัะพะดะตัะถะธััั ะฒ ะผะฐััะธะฒะต
for (final JsonNode objNode : arrNode) {
//ะฒ ะฐััะธะฑััะต "dt_txt" ะบะฐะถะดะพะณะพ ะผะฐะปะตะฝัะบะพะณะพ ัะทะปะฐ ั
ัะฐะฝะธะปะพัั ะฒัะตะผั ะฟัะพะณะฝะพะทะฐ, ั ะพัะพะฑัะฐะป ะดะฐะฝะฝัะต ะทะฐ 9 ัััะฐ ะธ 6 ะฒะตัะตัะฐ
String forecastTime = objNode.get("dt_txt").toString();
if (forecastTime.contains("09:00") || forecastTime.contains("18:00")) {
weatherList.add(objNode.toString());
}
}
}
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ฐ ์ค์ด ํน์ ์๊ฐ์ JSON ์ผ๊ธฐ ์๋ณด๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ชฉ๋ก์ ์ป์์ต๋๋ค. ๋จ์ ๊ฒ์ ์ํ๋ ๊ฒ์ ์ถ์ถํ๊ณ ํ์์ ์ง์ ํ๋ ๊ฒ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ค์ด ์๋ค๋ฉด:
"main":{"temp":261.45,"temp_min":259.086,"temp_max":261.45,"pressure":1023.48,"sea_level":1045.39,"grnd_level":1023.48,"humidity":79,"temp_kf":2.37}
๊ทธ๋ฌ๋ฉด ์ด๊ฒ์ "main"์ด๋ผ๋ ๋
ธ๋์
๋๋ค. ์๋ฅผ ๋ค์ด ํด์๋ฉด๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ก ์ถฉ๋ถํฉ๋๋ค.
ObjectMapper objectMapper = new ObjectMapper();
//line - ััะพ ะฝะฐัะฐ JSON-ัััะพะบะฐ
mainNode = objectMapper.readTree(line).get("main");
String seaLevel = mainNode.get("sea_level");
Jackson์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ซ์ ํ์์ผ๋ก ์ฆ์ ํํํ ์ ์์ต๋๋ค.
double seaLevel = mainNode.get("sea_level").asDouble();
์ด์ ์ฐ๋ฆฌ๋ ์์ธก์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ผ๋ฉฐ, ๋จ์ ๊ฒ์ ์ํ๋ ๋๋ก ์ด๋ฅผ ์ฐ๊ฒฐํ์ฌ Telegram์ ํตํด ์ฌ์ฉ์์๊ฒ ๋ณด๋ด๋ ๊ฒ๋ฟ์
๋๋ค. ์ ์ฒด ์์ค ์ฝ๋๋ ๋ด github ์ ์์ง๋ง ๋งํฌ๋ฅผ ์ฌ์ฉ ํ๊ฑฐ๋ Telegram ๊ฒ์์์ @denifoBot์ ์ฐพ์ ์ค์ ๋ด์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค . ๋์ ์ด๋ฆ์ "Kyiv" ๋๋ "Moscow"์ ๊ฐ์ด ๋ผํด์ด ์์ญ์ผ๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค. ๊ณ ๋ง์ต๋๋ค. ๋๊น์ง ํด๋ด์
จ๋ค๋ฉด ํฉ๋นํ ๋นํ์ ๋ฐ์๋ค์
๋๋ค. ์ ๋ ๋จ์ง ์ฐ๋ฆฌ ๋์์ ๋ฐฐ๊ณ ํ ์ธ์ฌ๋ค๊ณผ ๊ฒฝ์ํ๊ธฐ ์ํด GitHub์์ ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ๋ฐฐ์ฐ๊ณ ๊ฐ๋ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค :) ๋ชจ๋ ์๋
! PS ์ฌ๊ธฐ์ ์คํ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๋ชจ๋ ๋ด์ฉ์ ๊ฐ์ธ ๋ฉ์์ง๋ก ๋ณด๋ด๊ฑฐ๋ ์ ๋ง๋ก ํ๊ฐ ๋๋ฉด ๋๊ธ๋ก ๋ณด๋ด์
๋ ๋ฉ๋๋ค :)
GO TO FULL VERSION