๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

10๋ถ„ ๋งŒ์— ์™„์„ฑํ•˜๋Š” ๋งž์ถคํ˜• ๋‚ ์”จ ์•Œ๋ฆผ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ

by ์—์ด์—์Šค๋น„ํƒ€ 2025. 5. 6.
๋ฐ˜์‘ํ˜•

๐ŸŽฏ ์ œ๋ชฉ: 10๋ถ„ ๋งŒ์— ์™„์„ฑํ•˜๋Š” ๋งž์ถคํ˜• ๋‚ ์”จ ์•Œ๋ฆผ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ


๐ŸŒฆ๏ธ ์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์Šค๋งˆํŠธํฐ์˜ ๋‚ ์”จ ์•Œ๋ฆผ์ด ๋งค๋ฒˆ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ด์–ด์„œ ๋‹ต๋‹ตํ•˜์…จ๋‚˜์š”? ๐Ÿง ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ‘œ๊ธฐ ๋ฐฉ์‹์œผ๋กœ, ํŠน์ • ์ง€์—ญ ๋‚ ์”จ๋งŒ ๋”ฑ๋”ฑ ๋งž์ถฐ์„œ ๋ฐ›๊ณ  ์‹ถ์€๋ฐ ๋ฐฉ๋ฒ•์„ ๋ชฐ๋ผ์„œ ๊ณ ๋ฏผ ์ค‘์ด์‹ ๊ฐ€์š”? โ˜๏ธ ์˜ค๋Š˜์€ ๋”ฑ 10๋ถ„์ด๋ฉด ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ‘๋งž์ถคํ˜• ๋‚ ์”จ ์•Œ๋ฆผ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ’์— ๋Œ€ํ•ด ์†Œ๊ฐœํ• ๊ฒŒ์š”! ๐Ÿš€ ์ด ๊ธ€์„ ๋๊นŒ์ง€ ์ฝ์œผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์†์‰ฝ๊ฒŒ ์ž์‹ ๋งŒ์˜ ๋‚ ์”จ ์•Œ๋ฆผ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜Š


๐Ÿ“š ์˜ค๋Š˜ ์ฃผ์ œ ๋ฌด์—‡?

์ด ๊ธ€์—์„œ๋Š” ํŒŒ์ด์ฌ(Python)์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ์ธ ๋งž์ถคํ˜• ๋‚ ์”จ ์•Œ๋ฆผ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์ƒ์„ธํ•˜๊ฒŒ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“ ์ดˆ๋ณด์ž๋„ ๋”ฐ๋ผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ๊ณ„๋ณ„๋กœ ์‰ฌ์šด ์„ค๋ช…๊ณผ ํ•จ๊ป˜, ์‹ค์šฉ์ ์ธ ํŒ๋„ ๊ฐ€๋“ ๋„ฃ์—ˆ์–ด์š”! ๐Ÿ˜Ž


๐Ÿ”ฅ ์™œ ์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

  • โœ… ์ธํ„ฐ๋„ท ๋‚ ์”จ ์„œ๋น„์Šค ๋Œ€์‹ , ์›ํ•˜๋Š” ์ง€์—ญ ์ •๋ณด๋งŒ ๋น ๋ฅด๊ฒŒ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ
  • โœ… ํŠน์ • ์กฐ๊ฑด(๋‚ ์”จ ๋น„/๋ˆˆ/๊ตฌ๋ฆ„ ๋งŽ์Œ/๊ธฐ์˜จ ๋“ฑ)์— ๋งž๋Š” ์•Œ๋ฆผ๋งŒ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ
  • โœ… ๋‚˜๋งŒ์˜ ๋งž์ถคํ˜• ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณผ ์ž์‹ ์ด ์ƒ๊ธธ ๋•Œ
  • โœ… 10๋ถ„ ๋งŒ์— ์™„์„ฑํ•˜๋Š” ์‰ฌ์šด ํ”„๋กœ์ ํŠธ๋กœ, ํŒŒ์ด์ฌ ๊ธฐ์ดˆ ์‹ค๋ ฅ์„ ๋†’์ด๊ณ  ์‹ถ์„ ๋•Œ

๐ŸŽ‰ ์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด ๋ณผ๊นŒ์š”?


๐Ÿ’ป ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ์‚ฌ์ „ ์ค€๋น„

๐ŸŒ ๊ธฐ๋ณธ ์กฐ๊ฑด

  • Python 3.x ๋ฒ„์ „ ์„ค์น˜ โœ… (Python ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ๋ฌด๋ฃŒ ๋‹ค์šด๋กœ๋“œ!)
  • ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ OK ๐ŸŒ
  • ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ์—๋””ํ„ฐ (VSCode, ์•™์ƒ๋ธ” ๋“ฑ ์ถ”์ฒœ) ๐Ÿ“

๐Ÿ”‘ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • requests (์›น ์š”์ฒญ์šฉ) โœ…
  • schedule (์Šค์ผ€์ค„๋Ÿฌ) โœ…
  • pandas (์ž๋ฃŒ์ฒ˜๋ฆฌ์šฉ, ์„ ํƒ์ ) โœ…

bash
pip install requests schedule pandas

๐Ÿ” API ํ‚ค ๋ฐœ๊ธ‰ ํ•„์ˆ˜

  • OpenWeatherMap ๋˜๋Š” ๊ธฐ์ƒ์ฒญ OpenAPI ํ™œ์šฉ ์ถ”์ฒœ โ˜€๏ธ
  • ๋ฌด๋ฃŒ ํ”Œ๋žœ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅ!

๐Ÿงฉ ํ•ต์‹ฌ ๋‹จ๊ณ„๋ณ„ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. โš™๏ธ API ์—ฐ๋™ ์ค€๋น„ํ•˜๊ธฐ

  • ๋ฌด๋ฃŒ API ํ‚ค ๋ฐœ๊ธ‰ ํ›„, API ์—”๋“œํฌ์ธํŠธ(URL) ํ…Œ์ŠคํŠธ
  • ์ž์‹ ์ด ์›ํ•˜๋Š” ์ง€์—ญ(์œ„๋„, ๊ฒฝ๋„ ๋˜๋Š” ๋„์‹œ๋ช…) ํ•„์š” ์ •๋ณด ์ž…๋ ฅ

๐Ÿ”น ์˜ˆ์‹œ: OpenWeatherMap API ๊ตฌ์กฐ
python
api_key = "๋‹น์‹ ์˜_APIํ‚ค"
city = "์„œ์šธ"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"


2. ๐Ÿ”ข ๋‚ ์”จ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ฐ ํŒŒ์‹ฑํ•˜๊ธฐ

  • requests๋กœ API ํ˜ธ์ถœ ํ›„, JSON ํ˜•์‹์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ
  • ๋”•์…”๋„ˆ๋ฆฌ์—์„œ ์›ํ•˜๋Š” ์ •๋ณด ์ถ”์ถœ (์˜จ๋„, ๊ฐ•์ˆ˜๋Ÿ‰, ๋‚ ์”จ ์ƒํƒœ ๋“ฑ)

python
import requests

response = requests.get(url)
data = response.json()

์˜จ๋„ = data['main']['temp']
๋‚ ์”จ์ƒํƒœ = data['weather'][0]['description']

โญ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ !

  • ‘units=metric’์œผ๋กœ ํ•˜๋ฉด ์„ญ์”จ๋กœ ๋ฐ”๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
  • ‘response.json()’์œผ๋กœ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑ ๊ฐ€๋Šฅ!

3. ๐Ÿ“Œ ๋งž์ถค ์กฐ๊ฑด๋ณ„ ์•Œ๋ฆผ ์„ค์ •ํ•˜๊ธฐ

  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ•์ˆ˜ํ™•๋ฅ  50% ์ด์ƒ์ด๋ฉด ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ
  • ๋˜๋Š”, ์˜จ๋„ 0๋„ ์ดํ•˜์ด๋ฉด ‘์ถ”์šด ๋‚ ์”จ์ž…๋‹ˆ๋‹ค’ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ

python
if 'rain' in ๋‚ ์”จ์ƒํƒœ or ์˜จ๋„ < 0:
send_alert("์˜ค๋Š˜์€ ์šฐ์‚ฐ์ด ํ•„์ˆ˜! ๋˜๋Š” ๋„ˆ๋ฌด ์ถฅ๋„ค์š”! โ˜”๐Ÿฅถ")

โญ ์ค‘์š”ํ•œ ํฌ์ธํŠธ!

  • ์กฐ๊ฑด๋ฌธ์„ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅ
  • ํ•„์š” ์‹œ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์กฐ๊ฑด ๋ฐ”๊พธ๊ธฐ

4. ๐Ÿ“ฑ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ (์ด๋ฉ”์ผ, ๋ฌธ์ž, ์•ฑ ํ‘ธ์‹œ ๋“ฑ)

  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ฉ”์ผ ๋˜๋Š” ์Šฌ๋ž™(Slack), ํ…”๋ ˆ๊ทธ๋žจ(Telegram) ์—ฐ๋™ ๊ฐ€๋Šฅ
  • ์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ์˜ˆ์ œ!

python
import smtplib

def send_email(subject, body):
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("์ด๋ฉ”์ผ@gmail.com", "๋น„๋ฐ€๋ฒˆํ˜ธ")
message = f"Subject:{subject}\n\n{body}"
server.sendmail("์ด๋ฉ”์ผ@gmail.com", "๋ฐ›๋Š”์ด์ด๋ฉ”์ผ", message)
server.quit()

โญ ์ฐธ๊ณ !

  • Gmail SMTP๋Š” ‘๋ณด์•ˆ ์ˆ˜์ค€ ๋‚ฎ์€ ์•ฑ ํ—ˆ์šฉ’ ํ•„์š”, ๋˜๋Š” ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ ์ถ”์ฒœโœ…

5. ๐Ÿ”„ ์Šค์ผ€์ค„๋Ÿฌ ๋“ฑ๋ก์œผ๋กœ ๋งค์ผ/์‹œ๊ฐ„๋ณ„ ์ž๋™ํ™”

  • schedule ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ
  • ๋งค์ผ ์˜ค์ „ 7์‹œ๋งˆ๋‹ค ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ

python
import schedule
import time

def job():
# ๋‚ ์”จ ์ฒดํฌ ๋ฐ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ
check_weather_and_notify()

schedule.every().day.at("07:00").do(job)

while True:
schedule.run_pending()
time.sleep(60)


๐Ÿ ์ „์ฒด ์ฝ”๋“œ ์ •๋ฆฌ + ์‹คํ–‰ ๋ฐฉ๋ฒ•

python
import requests
import schedule
import time
import smtplib

API ์ •๋ณด

API_KEY = "์—ฌ๋Ÿฌ๋ถ„์˜_APIํ‚ค"
CITY = "์„œ์šธ" # ์›ํ•˜๋Š” ์ง€์—ญ ์ž…๋ ฅ

์ด๋ฉ”์ผ ์ •๋ณด

FROM_EMAIL = "your_email@gmail.com"
PASSWORD = "your_email_password"
TO_EMAIL = "target_email@gmail.com"

๋‚ ์”จ ์ฒดํฌ ํ•จ์ˆ˜

def check_weather_and_notify():
url = f"http://api.openweathermap.org/data/2.5/weather?q={CITY}&appid={API_KEY}&units=metric"
response = requests.get(url)
data = response.json()

temp = data['main']['temp']
weather_desc = data['weather'][0]['description']

alert_msg = ""
if 'rain' in weather_desc or temp < 0:
    alert_msg = f"๐ŸŒง๏ธ ์˜ค๋Š˜ {CITY}์˜ ๋‚ ์”จ๋Š” {weather_desc}์ด๋ฉฐ, ์˜จ๋„๋Š” {temp}๋„์ž…๋‹ˆ๋‹ค. ์šฐ์‚ฐ ์ฑ™๊ธฐ์„ธ์š”! โ˜”"
elif temp > 30:
    alert_msg = f"๐Ÿ”ฅ ์˜ค๋Š˜ {CITY}๋Š” ๋”์œ„ ์กฐ์‹ฌ! ๊ธฐ์˜จ์ด {temp}๋„๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ”์–ด์š”. ์ˆ˜๋ถ„ ์„ญ์ทจ ์žŠ์ง€ ๋งˆ์„ธ์š”! ๐Ÿ’ง"

if alert_msg:
    send_email("๋‚ ์”จ ์•Œ๋ฆผ ๐ŸŒฅ๏ธ", alert_msg)

์ด๋ฉ”์ผ ๋ฐœ์†ก ํ•จ์ˆ˜

def send_email(subject, body):
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(FROM_EMAIL, PASSWORD)
message = f"Subject:{subject}\n\n{body}"
server.sendmail(FROM_EMAIL, TO_EMAIL, message)
server.quit()
print("์ด๋ฉ”์ผ ์„ฑ๊ณต์  ๋ฐœ์†ก! ๐ŸŽ‰")
except Exception as e:
print("์ด๋ฉ”์ผ ๋ฐœ์†ก ์‹คํŒจ ๐Ÿ˜ข:", e)

์Šค์ผ€์ค„ ์„ค์ •

schedule.every().day.at("07:00").do(check_weather_and_notify)

๋ฌดํ•œ ๋ฃจํ”„๋กœ ์‹คํ–‰ ์œ ์ง€

print("๋‚ ์”จ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ์‹œ์ž‘! ๐Ÿš€")
while True:
schedule.run_pending()
time.sleep(60)


โœจ ์ง€๊ธˆ ๋ฐ”๋กœ ์‹ค์ „ ์ ์šฉ TIP!

  • API Keys๋Š” ์ ˆ๋Œ€ ๊ณต๊ฐœํ•˜์ง€ ๋ง๊ธฐ ๐Ÿ”’
  • Gmail SMTP ์‚ฌ์šฉ ์‹œ ‘์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ’ ์ƒ์„ฑ ์ถ”์ฒœ ๐Ÿ”‘
  • ์กฐ๊ฑด๋ฌธ·์•Œ๋ฆผ ๋ฉ”์‹œ์ง€๋Š” ํ™œ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ HTML ๋˜๋Š” ํ‘ธ์‹œ์•Œ๋ฆผ๋„ ๊ฐ€๋Šฅ! ๐Ÿ“ฑ
  • ์ฃผ๊ธฐ์  ํ…Œ์ŠคํŠธ๋กœ ๋ฒ„๊ทธ ๋ฐฉ์ง€ํ•˜๊ธฐ โœ…

๐ŸŽ‰ ์™„๋ฃŒ ํ›„, ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋Š”?

  • ๐Ÿงณ ์—ฌ๋Ÿฌ ์ง€์—ญ ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ์ฒดํฌํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€!
  • ๐Ÿ”” ๋‹ค์–‘ํ•œ ์•Œ๋ฆผ ์ˆ˜๋‹จ(์นด์นด์˜คํ†ก, ํ…”๋ ˆ๊ทธ๋žจ) ์—ฐ๋™!
  • ๐Ÿ“… ์ฃผ๊ฐ„/์›”๊ฐ„ ๋‚ ์”จ ์š”์•ฝ ๋ฆฌํฌํŠธ๋„ ๋งŒ๋“ค์–ด๋ณด๊ธฐ!
  • ๐Ÿ’ป ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํŠธํด๋ฆฌ์˜ค์— ๋‚จ๊ฒจ๋‘๊ธฐ!

๐Ÿ” ๋งˆ๋ฌด๋ฆฌ ์œ ์˜์‚ฌํ•ญ

  • ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ๋Š๊ธฐ ์•Š๋„๋ก! ๐ŸŒ
  • API ํ˜ธ์ถœ ํšŸ์ˆ˜ ์ œํ•œ ์ฃผ์˜! (๋ฌด๋ฃŒ ํ”Œ๋žœ์€ ํ•˜๋ฃจ2,000ํšŒ ์ •๋„) ๐Ÿšง
  • ํ˜น์‹œ ์˜ค๋ฅ˜ ๋‚˜๋Š” ๋ถ€๋ถ„ ์žˆ์œผ๋ฉด, ๊ตฌ๊ธ€๋ง๊ณผ ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ  ํ•„์ˆ˜!

๐Ÿ† ๊ฒฐ๋ก 

๋‹จ 10๋ถ„์ด๋ฉด ๋‚˜๋งŒ์˜ ๋‚ ์”จ ์•Œ๋ฆผ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽˆ ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ฐจ๊ทผ์ฐจ๊ทผ ๋”ฐ๋ผ ํ•ด ๋ณด๋ฉด์„œ, ์ž์‹ ์˜ ๋‚ ์”จ ์ •๋ณด๋ฅผ ๋” ์Šค๋งˆํŠธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ์Šต๊ด€, ๊ผญ ๊ธธ๋Ÿฌ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿš€ ์–ธ์ œ ์–ด๋””์„œ๋“  ๋‚ ์”จ ์ •๋ณด, ์ด์ œ ๋ฌด์กฐ๊ฑด ๋‚ด ์†์•ˆ์—! โ˜€๏ธ๐ŸŒง๏ธ


๐Ÿš€ ์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”! ๊ถ๊ธˆํ•œ ์ ์€ ๋Œ“๊ธ€ ๋˜๋Š” ๋ฉ”์‹œ์ง€ ์ฃผ์„ธ์š”! ๐Ÿ’ฌ ๊ทธ๋Ÿผ ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ ๋งŒ๋‚˜์š”! ๐Ÿ™Œ

์ด์ „ ๊ธ€ ๋ณด๊ธฐ!!

๋ฐ˜์‘ํ˜•