JavaRush /Java Blog /Random-KO /์šฐ๋ฆฌ๋Š” ๋ฉฐ์น  ์ €๋…์— Telegram์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋‚ ์”จ ๋ด‡์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Philip J.
๋ ˆ๋ฒจ 40
ะ”ะฝะตะฟั€

์šฐ๋ฆฌ๋Š” ๋ฉฐ์น  ์ €๋…์— Telegram์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋‚ ์”จ ๋ด‡์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ํ…”๋ ˆ๊ทธ๋žจ์šฉ ๋ด‡์„ ๋งŒ๋“œ๋Š” ์ฃผ์ œ๋Š” ๋‹ค์†Œ ํ—˜๋‚œํ•˜๊ณ  ๋งŽ์€ ๊ฐ€์ด๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ด ๊ฐ€์ด๋“œ ). ๋”ฐ๋ผ์„œ ์ผ๋ถ€ ํƒ€์‚ฌ API ์ž‘์—…์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์›น ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ€์žฅ ๊ธฐ๋Šฅ์ ์ด๊ณ  ์œ ์šฉํ•œ ์˜ˆ์ธก์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์ž‘๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ, ๊ธฐ์ƒ ์‚ฌ์ดํŠธ์™€ ๊ฒฝ์Ÿํ•  ์ด์œ ๊ฐ€ ์—†์œผ๋ฉฐ, Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ ์—ฐ๊ฒฐ ๋ฐ ๋ฐ์ดํ„ฐ ๊ตฌ๋ฌธ ๋ถ„์„ ์ž‘์—… ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋จผ์ € ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ๋…ผ๋ฆฌ์  ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๋ฉ”์‹œ์ง€ ์ˆ˜๋ฝ
  • ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์œ ํšจํ•œ ๋ช…๋ น์ธ ๊ฒฝ์šฐ ์‘๋‹ต์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋„์‹œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ผ๊ธฐ ์˜ˆ๋ณด๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฑ„ํŒ…์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค€๋น„๋œ ์ •๋ณด๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์‚ฌํ•ญ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ Telegram API ์ž‘์—…์—๋งŒ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์œ„์— ์™ผ์ชฝ ๋งํฌ๋ฅผ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‘ ๋ฒˆ์งธ ์ ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค. API๋Š” ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด VKontakte๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์นœ๊ตฌ ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ VK ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์–ด๋”˜๊ฐ€์— ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์ฒด์ปค ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด์˜ ์นœ๊ตฌ ๋ชฉ๋ก์„ ์–ป์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” VK API์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐพ๊ณ  ์ด ๋ชฉ๋ก์„ ์–ป๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์š”์ฒญ์ด ํ•„์š”ํ•œ์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ์ด ์š”์ฒญ์„ HTTP ์š”์ฒญ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋‘ ๊ฐ€์ง€ HTTP ์š”์ฒญ์€ GET๊ณผ POST์ž…๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—๋„ ๊ทธ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์ถฉ๋ถ„ํžˆ ์žˆ์œผ๋ฏ€๋กœ ๋ง๋ฆฌ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉ์ , ์ฆ‰ ์ผ๊ธฐ ์˜ˆ๋ณด ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์œผ๋ ค๋ฉด ๊ฐ„๋‹จํ•œ GET ์š”์ฒญ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์›น ์„œ๋ฒ„์— GET ์š”์ฒญ์„ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์Šคํƒ€์ผ, ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ํŽ˜์ด์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” HTML ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. API ์„œ๋ฒ„์— ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ํ•˜๋ฉด ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ€์ผ๊ณผ ์Šคํฌ๋ฆฝํŠธ ์—†์ด ์›์‹œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฉฐ์น  ์ €๋…์— Telegram์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋‚ ์”จ ๋ด‡์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค - 1์ด ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ํŽ˜์ด์ง€์—๋Š” ์ •๋ณด ์ž์ฒด ์™ธ์—๋Š” ์ถ”๊ฐ€ ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์›์‹œ ๋ฐ์ดํ„ฐ๋Š” JSON ๋˜๋Š” XML์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํ‘œ์ค€ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์—๋Š” ์žฅ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์Šคํฌ๋ฆฐ์ƒท์—์„œ ์ด๋ฏธ JSON์„ ๋ณด์…จ๊ณ , XML์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฉฐ์น  ์ €๋…์— Telegram์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋‚ ์”จ ๋ด‡์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค - 2์งง์€ ๊ฒ€์ƒ‰ ๋์— ์˜์–ด Open Weather Map ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ถ„๋‹น 50๊ฐœ ์ด์ƒ ์š”์ฒญํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด๋ฃŒ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋“ฑ๋กํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๊ธฐ๊พผ์ด ์•„๋‹ˆ๋ผ ๊ดœ์ฐฎ์€ ๋ฏธ๋ž˜ ๊ฐœ๋ฐœ์ž์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ ํ•œ ํ† ํฐ(์ฝ”๋“œ)์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ( tyts ) ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ ์–‘์‹ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋ชจ๋“  ๋„์‹œ์— ๋Œ€ํ•œ 5์ผ ์ผ๊ธฐ์˜ˆ๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฉฐ์น  ์ €๋…์— Telegram์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋‚ ์”จ ๋ด‡์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค - 3 ์‘๋‹ต์€ 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 ์—ฌ๊ธฐ์— ์˜คํƒ€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋ชจ๋“  ๋‚ด์šฉ์„ ๊ฐœ์ธ ๋ฉ”์‹œ์ง€๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์ •๋ง๋กœ ํ™”๊ฐ€ ๋‚˜๋ฉด ๋Œ“๊ธ€๋กœ ๋ณด๋‚ด์…”๋„ ๋ฉ๋‹ˆ๋‹ค :)
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION