터미널을 켜고 날씨를 확인할 때 밋밋한 텍스트 대신 이모지로 표현된 날씨를 볼 수 있다면 어떨까요. 오늘 비가 올지 안 올지 궁금할 때 터미널에 🌧️ 이모지가 뜨는 걸 보면 우산 챙기기도 쉬워져요. macOS 터미널에서 Python으로 이런 도구를 직접 만들어보세요.
OpenWeatherMap API 키 발급받기
날씨 데이터를 가져오려면 먼저 API가 필요해요. OpenWeatherMap은 무료로 하루 1,000번까지 호출할 수 있어서 개인 프로젝트에 딱이에요.
# 1. openweathermap.org에 가입
# 2. API Keys 메뉴에서 키 생성
# 3. 생성된 키를 복사해두기
API_KEY = "여기에_발급받은_키_입력"
회원가입 후 이메일 인증까지 마치면 API 키가 활성화되는데, 보통 10분에서 2시간 정도 걸려요. 기다리는 동안 코드 구조를 먼저 짜보는 것도 좋은 방법이에요.
Python 환경 설정과 필요한 패키지 설치
macOS에는 기본적으로 Python이 설치되어 있지만, 최신 버전을 사용하는 게 좋아요. Homebrew로 Python 3를 설치하고 필요한 패키지를 준비해요.
# Homebrew로 Python 3 설치
brew install python3
# 프로젝트 폴더 생성
mkdir weather-emoji && cd weather-emoji
# 가상환경 만들기 (선택사항이지만 권장)
python3 -m venv venv
source venv/bin/activate
# 필요한 패키지 설치
pip install requests
가상환경을 사용하면 시스템 Python과 충돌 없이 깔끔하게 프로젝트를 관리할 수 있어요. 특히 여러 프로젝트를 동시에 진행할 때는 꼭 필요한 습관이에요.
날씨 상태별 이모지 매핑하기
OpenWeatherMap API는 날씨 상태를 영어로 반환해요. Clear, Clouds, Rain 같은 값들을 이모지로 변환하는 딕셔너리를 만들어보세요.
# weather_emoji.py 파일 생성
import requests
import json
import sys
# 날씨 상태와 이모지 매핑
WEATHER_EMOJI = {
"Clear": "☀️", # 맑음
"Clouds": "☁️", # 구름
"Rain": "🌧️", # 비
"Drizzle": "🌦️", # 이슬비
"Thunderstorm": "⛈️", # 천둥번개
"Snow": "❄️", # 눈
"Mist": "🌫️", # 안개
"Fog": "🌫️", # 짙은 안개
"Haze": "🌫️", # 연무
"Dust": "💨", # 먼지
"Sand": "🏜️", # 모래
"Ash": "🌋", # 화산재
"Squall": "🌬️", # 돌풍
"Tornado": "🌪️" # 토네이도
}
# 온도별 체감 이모지 추가
def get_temp_emoji(temp):
"""섭씨 온도에 따른 체감 이모지 반환"""
if temp < 0:
return "🥶" # 영하
elif temp < 10:
return "🧊" # 추움
elif temp < 20:
return "😊" # 선선함
elif temp < 30:
return "😎" # 따뜻함
else:
return "🥵" # 더움
이모지 매핑에서 중요한 건 API가 반환하는 모든 날씨 상태를 커버하는 거예요. 예상치 못한 값이 들어와도 에러가 나지 않도록 기본값을 설정하는 게 실무에서는 필수예요.
API 호출과 데이터 파싱
이제 실제로 API를 호출해서 날씨 정보를 가져오는 함수를 만들어요. 도시 이름을 입력받아 해당 지역의 날씨를 조회해요.
def get_weather(city, api_key):
"""OpenWeatherMap API로 날씨 정보 가져오기"""
# API 엔드포인트 URL
base_url = "http://api.openweathermap.org/data/2.5/weather"
# 파라미터 설정 (섭씨 온도 단위 사용)
params = {
"q": city,
"appid": api_key,
"units": "metric", # 섭씨 온도
"lang": "kr" # 한국어 설명 (선택사항)
}
try:
# API 호출
response = requests.get(base_url, params=params)
response.raise_for_status() # HTTP 에러 체크
# JSON 데이터 파싱
data = response.json()
# 필요한 정보 추출
weather_main = data["weather"][0]["main"]
weather_desc = data["weather"][0]["description"]
temp = data["main"]["temp"]
feels_like = data["main"]["feels_like"]
humidity = data["main"]["humidity"]
city_name = data["name"]
return {
"status": "success",
"city": city_name,
"weather": weather_main,
"description": weather_desc,
"temp": temp,
"feels_like": feels_like,
"humidity": humidity
}
except requests.exceptions.RequestException as e:
return {"status": "error", "message": f"API 호출 실패: {e}"}
except KeyError as e:
return {"status": "error", "message": f"데이터 파싱 실패: {e}"}
에러 처리를 꼼꼼하게 해두면 네트워크 문제나 잘못된 도시 이름 입력 같은 상황에서도 프로그램이 멈추지 않아요. 사용자 경험을 해치지 않는 안정적인 도구를 만드는 첫걸음이에요.
터미널에 예쁘게 출력하기
데이터를 가져왔으니 이제 터미널에 보기 좋게 출력할 차례예요. 색상을 추가하면 더 멋있지만, 일단 이모지만으로도 충분히 직관적이에요.
def display_weather(weather_data):
"""날씨 정보를 이모지와 함께 터미널에 출력"""
if weather_data["status"] == "error":
print(f"❌ 오류: {weather_data['message']}")
return
# 날씨 이모지 가져오기
weather_emoji = WEATHER_EMOJI.get(weather_data["weather"], "🌈")
temp_emoji = get_temp_emoji(weather_data["temp"])
# 출력 포맷팅
print("\n" + "="*40)
print(f"📍 {weather_data['city']} 날씨 정보")
print("="*40)
print(f"\n날씨: {weather_emoji} {weather_data['description']}")
print(f"온도: {temp_emoji} {weather_data['temp']:.1f}°C")
print(f"체감: {weather_data['feels_like']:.1f}°C")
print(f"습도: 💧 {weather_data['humidity']}%")
# 날씨별 추천 메시지
if weather_data["weather"] == "Rain":
print("\n☔ 우산 챙기는 거 잊지 마세요!")
elif weather_data["weather"] == "Clear" and weather_data["temp"] > 25:
print("\n🧴 자외선 차단제 바르세요!")
elif weather_data["temp"] < 5:
print("\n🧣 따뜻하게 입으세요!")
print("="*40 + "\n")
터미널 출력에서 구분선을 적절히 사용하면 정보가 한눈에 들어와요. 날씨에 따른 간단한 추천 메시지를 추가하면 단순한 정보 전달을 넘어 실용적인 도구가 되죠.
CLI 명령어로 만들기
이제 모든 기능을 합쳐서 터미널에서 바로 실행할 수 있는 CLI 도구로 만들어요.
def main():
"""메인 실행 함수"""
# 명령행 인자 처리
if len(sys.argv) < 2:
print("사용법: python weather_emoji.py [도시명]")
print("예시: python weather_emoji.py Seoul")
sys.exit(1)
# 도시명 가져오기 (여러 단어 도시명 지원)
city = " ".join(sys.argv[1:])
# API 키 (실제 사용시 환경변수로 관리 권장)
API_KEY = "여기에_API_키_입력"
# 날씨 정보 가져오기
print(f"🔍 {city}의 날씨 정보를 가져오는 중...")
weather_data = get_weather(city, API_KEY)
# 결과 출력
display_weather(weather_data)
if __name__ == "__main__":
main()
실행 파일로 만들어 어디서나 사용하기
매번 python weather_emoji.py를 입력하는 대신, 터미널 어디서나 weather Seoul 같은 명령어로 실행할 수 있게 만들어보세요.
# 실행 권한 추가
chmod +x weather_emoji.py
# 파일 첫 줄에 shebang 추가
#!/usr/bin/env python3
# /usr/local/bin에 심볼릭 링크 생성
sudo ln -s $(pwd)/weather_emoji.py /usr/local/bin/weather
# 이제 어디서나 사용 가능
weather Seoul
weather "New York"
weather Tokyo
환경변수로 API 키 관리하기
API 키를 코드에 직접 넣는 건 보안상 좋지 않아요. 환경변수로 관리하면 GitHub에 올려도 안전해요.
import os
# 환경변수에서 API 키 가져오기
API_KEY = os.environ.get("OPENWEATHER_API_KEY")
if not API_KEY:
print("⚠️ 환경변수 OPENWEATHER_API_KEY를 설정해주세요")
print("export OPENWEATHER_API_KEY='your_api_key_here'")
sys.exit(1)
# ~/.zshrc 또는 ~/.bash_profile에 추가
export OPENWEATHER_API_KEY="실제_API_키"
# 변경사항 적용
source ~/.zshrc
자주 확인하는 도시 별칭 만들기
매일 확인하는 도시가 있다면 별칭을 만들어두면 편해요.
# 도시 별칭 딕셔너리
CITY_ALIASES = {
"home": "Seoul",
"work": "Gangnam",
"vacation": "Jeju"
}
# main 함수에서 별칭 체크
city_input = " ".join(sys.argv[1:])
city = CITY_ALIASES.get(city_input.lower(), city_input)
이렇게 하면 weather home 같은 명령어로 빠르게 자주 가는 곳의 날씨를 확인할 수 있어요.
캐싱으로 API 호출 줄이기
같은 도시를 자주 확인한다면 캐싱을 추가해서 API 호출을 줄일 수 있어요. 10분 정도는 같은 데이터를 재사용해도 충분해요.
import pickle
import time
from pathlib import Path
def get_cached_weather(city, api_key, cache_minutes=10):
"""캐시된 날씨 정보 또는 새로운 정보 반환"""
cache_dir = Path.home() / ".weather_cache"
cache_dir.mkdir(exist_ok=True)
cache_file = cache_dir / f"{city.lower()}.pkl"
# 캐시 확인
if cache_file.exists():
with open(cache_file, 'rb') as f:
cached_data = pickle.load(f)
# 캐시 유효성 검사 (10분)
if time.time() - cached_data['timestamp'] < cache_minutes * 60:
print("📦 캐시된 데이터 사용")
return cached_data['data']
# 새로운 데이터 가져오기
weather_data = get_weather(city, api_key)
# 캐시 저장
if weather_data['status'] == 'success':
with open(cache_file, 'wb') as f:
pickle.dump({
'timestamp': time.time(),
'data': weather_data
}, f)
return weather_data
터미널에서 날씨를 확인하는 작은 도구지만, 이모지를 활용하면 훨씬 직관적이고 재미있어져요. 매일 아침 터미널을 열어 날씨를 확인하는 습관을 만들어보세요. 개발자답게 날씨를 확인하는 방법, 의외로 실용적이에요.