Python으로 날씨 정보 가져오기
requests + wttr.in API

왜 날씨 API로 시작했나

Java로 3년 정도 백엔드 개발을 해왔는데 Python은 처음이다. 문법책을 읽는 것보다 실제로 돌아가는 걸 만들면서 익히는 게 맞는 것 같아서 외부 API 호출을 첫 주제로 잡았다.

Java에서는 RestTemplate이나 HttpURLConnection으로 했던 걸, Python에서는 requests 라이브러리 하나로 얼마나 간단하게 할 수 있는지 궁금했다.

동작 흐름
⌨️도시명 입력Incheon...
🐍Python 코드requests.get()
🌐wttr.in APIJSON 응답
📊결과 출력기온·습도·바람

wttr.in은 API 키 없이 무료로 쓸 수 있는 날씨 서비스다. ?format=j1 파라미터로 JSON 형태로 받을 수 있다.

라이브러리 설치

Python 외부 패키지는 pip으로 설치한다. Java의 Maven/Gradle과 같은 역할이다.

 
terminal
pip install requests
전체 코드
 
weather.py
import requests
from datetime import datetime


def get_weather(city: str) -> dict:
    """wttr.in API로 날씨 정보를 가져옵니다. API 키 불필요."""
    url      = f"https://wttr.in/{city}?format=j1&lang=ko"
    response = requests.get(url, timeout=10)
    response.raise_for_status()

    data    = response.json()
    current = data["current_condition"][0]
    area    = data["nearest_area"][0]

    return {
        "city"      : area["areaName"][0]["value"],
        "country"   : area["country"][0]["value"],
        "temp_c"    : int(current["temp_C"]),
        "feels_like": int(current["FeelsLikeC"]),
        "humidity"  : int(current["humidity"]),
        "desc"      : current["lang_ko"][0]["value"],
        "wind_kmph" : int(current["windspeedKmph"]),
        "updated_at": datetime.now().strftime("%Y-%m-%d %H:%M"),
    }


def get_emoji(desc: str) -> str:
    if any(k in desc for k in ["맑", "화창"]):   return "☀️"
    if any(k in desc for k in ["구름", "흐림"]):  return "☁️"
    if any(k in desc for k in ["비", "소나기"]): return "🌧️"
    if "눈" in desc: return "❄️"
    return "🌤️"


if __name__ == "__main__":
    city  = input("도시명 입력 (영어): ")
    w     = get_weather(city)
    emoji = get_emoji(w["desc"])

    print(f"\n{emoji} {w['city']}, {w['country']}")
    print(f"  기온     : {w['temp_c']}°C (체감 {w['feels_like']}°C)")
    print(f"  날씨     : {w['desc']}")
    print(f"  습도     : {w['humidity']}%")
    print(f"  바람     : {w['wind_kmph']} km/h")
실행 결과
☁️ Incheon, South Korea 기온 : 8°C (체감 5°C) 날씨 : 흐림 습도 : 72% 바람 : 18 km/h 🌤️ Seoul, South Korea 기온 : 9°C (체감 6°C) 날씨 : 구름 조금 습도 : 65% 바람 : 14 km/h ☀️ Busan, South Korea 기온 : 12°C (체감 10°C) 날씨 : 맑음 습도 : 58% 바람 : 10 km/h
📍 Incheon · KR
☁️
8°C
흐림 · 체감 5°C
💧 습도72%
💨 바람18 km/h
☀️ UV1
📍 Seoul · KR
🌤️
9°C
구름 조금 · 체감 6°C
💧 습도65%
💨 바람14 km/h
☀️ UV2
📍 Busan · KR
☀️
12°C
맑음 · 체감 10°C
💧 습도58%
💨 바람10 km/h
☀️ UV3
Java 개발자 입장에서 느낀 것
 
Java vs Python — HTTP GET 비교
// Java (Spring) — RestTemplate
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response =
    restTemplate.getForEntity("https://wttr.in/Seoul?format=j1", String.class);

# Python — requests (이게 전부)
response = requests.get("https://wttr.in/Seoul?format=j1")
data     = response.json()  # JSON 파싱도 한 줄

Java에서 HTTP 요청 하나 날리려면 의존성 추가, 빈 등록, 예외처리까지 꽤 많은 준비가 필요한데 Python은 두 줄이면 끝이다. .json() 한 줄로 파싱까지 된다는 게 처음엔 좀 허무할 정도였다.

이번에 익힌 것들
  • requests.get(url) 으로 외부 API 호출하는 방법
  • response.json() 으로 JSON 파싱 — Java의 ObjectMapper 없이
  • 딕셔너리(dict) 접근 — Java HashMap과 비슷하지만 더 간결
  • f-string 포맷팅 — Java의 String.format() 보다 직관적
  • 함수 타입 힌트 def fn(arg: str) -> dict
  • raise_for_status() 로 HTTP 오류를 한 줄에 처리하는 패턴
다음에 만들 것
02JSON 파일 저장 + FastAPI 서버 만들기
03여러 도시 비교해서 HTML 리포트 자동 생성
04MySQL에 날씨 기록 저장하기