본문 바로가기
Python

API 활용하기 - 다른 서비스와 대화하기

by 샤나엘 2026. 2. 23.
반응형

API 활용하기 - 다른 서비스와 대화하기

API 활용하기 - 다른 서비스와 대화하기

웹 스크래핑보다 깔끔하고 공식적인 데이터 수집 방법! API를 통해 다양한 서비스의 데이터를 가져와 봅시다.


API란?

API(Application Programming Interface)는 프로그램끼리 대화하는 약속된 방법입니다.

레스토랑에 비유하면:

  • 당신 = 프로그램 (손님)
  • 메뉴판 = API 문서
  • 웨이터 = API
  • 주방 = 서버

메뉴판(API 문서)을 보고, 웨이터(API)에게 주문하면, 주방(서버)에서 요리(데이터)를 가져다 줍니다.


REST API 기본 개념

REST API 동작 원리

 

REST API는 HTTP 메서드를 사용해 데이터를 주고받습니다.

HTTP 메서드 동작 예시
GET 데이터 조회 사용자 목록 가져오기
POST 데이터 생성 새 게시글 작성
PUT 데이터 수정 프로필 정보 업데이트
DELETE 데이터 삭제 댓글 삭제

대부분의 공개 API는 GET 방식으로 데이터를 조회합니다.


JSON - API의 공용어

API가 주고받는 데이터는 대부분 JSON(JavaScript Object Notation) 형식입니다.

# JSON은 파이썬 딕셔너리와 매우 비슷합니다!
{
    "name": "홍길동",
    "age": 25,
    "skills": ["Python", "JavaScript"],
    "is_student": true
}

파이썬에서 JSON 다루기

import json

# JSON 문자열 → 파이썬 딕셔너리
json_str = '{"name": "홍길동", "age": 25}'
data = json.loads(json_str)
print(data["name"])  # 홍길동

# 파이썬 딕셔너리 → JSON 문자열
person = {"name": "이영희", "age": 30}
json_str = json.dumps(person, ensure_ascii=False)
print(json_str)  # {"name": "이영희", "age": 30}

첫 번째 API 호출

무료 연습용 API인 JSONPlaceholder를 사용해봅시다.

import requests

# 게시글 목록 가져오기
url = "https://jsonplaceholder.typicode.com/posts"
response = requests.get(url)

# JSON으로 변환
posts = response.json()  # 자동으로 파이썬 리스트/딕셔너리로 변환

# 처음 3개만 출력
for post in posts[:3]:
    print(f"[{post['id']}] {post['title']}")
    print()

실행 결과:

[1] sunt aut facere repellat provident occaecati excepturi optio reprehenderit
[2] qui est esse
[3] ea molestias quasi exercitationem repellat qui ipsa sit aut

매개변수 전달하기

URL 파라미터 (Query String)

import requests

# 특정 사용자의 게시글만 가져오기
url = "https://jsonplaceholder.typicode.com/posts"
params = {
    "userId": 1,       # 사용자 ID = 1
    "_limit": 3        # 3개만
}

response = requests.get(url, params=params)
posts = response.json()

for post in posts:
    print(f"[{post['id']}] {post['title'][:30]}...")

헤더 설정

import requests

headers = {
    "Accept": "application/json",
    "User-Agent": "MyPythonApp/1.0"
}

response = requests.get(url, headers=headers)

실전 예제 1: 날씨 API

Open-Meteo라는 무료 날씨 API를 사용해봅시다 (API 키 불필요).

import requests

# 서울의 현재 날씨
url = "https://api.open-meteo.com/v1/forecast"
params = {
    "latitude": 37.5665,    # 서울 위도
    "longitude": 126.9780,  # 서울 경도
    "current_weather": True
}

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

weather = data["current_weather"]
print(f"현재 온도: {weather['temperature']}°C")
print(f"풍속: {weather['windspeed']} km/h")
print(f"날씨 코드: {weather['weathercode']}")

실행 결과 예시:

현재 온도: 3.2°C
풍속: 12.5 km/h
날씨 코드: 3

실전 예제 2: 랜덤 사용자 생성 API

import requests

url = "https://randomuser.me/api/"
params = {"results": 3, "nat": "kr"}  # 한국 사용자 3명

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

for user in data["results"]:
    name = f"{user['name']['last']}{user['name']['first']}"
    email = user["email"]
    city = user["location"]["city"]
    print(f"이름: {name}")
    print(f"이메일: {email}")
    print(f"도시: {city}")
    print("-" * 30)

에러 처리

API 호출은 네트워크 문제나 서버 오류로 실패할 수 있습니다.

import requests

def safe_api_call(url, params=None):
    """안전한 API 호출 함수"""
    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()  # 4xx, 5xx 에러 시 예외 발생
        return response.json()
    except requests.exceptions.Timeout:
        print("요청 시간 초과!")
    except requests.exceptions.HTTPError as e:
        print(f"HTTP 에러: {e}")
    except requests.exceptions.ConnectionError:
        print("연결 실패! 인터넷 연결을 확인하세요.")
    except requests.exceptions.JSONDecodeError:
        print("JSON 파싱 실패!")
    return None

# 사용 예
data = safe_api_call("https://jsonplaceholder.typicode.com/posts/1")
if data:
    print(f"제목: {data['title']}")

API 키 사용하기

많은 API는 인증을 위해 API 키를 요구합니다.

import requests

# API 키 설정 (실제 키를 사용하세요)
API_KEY = "your_api_key_here"

# 방법 1: URL 파라미터에 포함
params = {
    "q": "Seoul",
    "appid": API_KEY
}
response = requests.get(url, params=params)

# 방법 2: 헤더에 포함
headers = {
    "Authorization": f"Bearer {API_KEY}"
}
response = requests.get(url, headers=headers)

주의: API 키는 비밀번호와 같습니다. 코드에 직접 쓰지 말고, 환경 변수나 별도 파일로 관리하세요!

import os

# 환경 변수에서 API 키 읽기 (권장)
API_KEY = os.environ.get("MY_API_KEY")

스크래핑 vs API 비교

항목 웹 스크래핑 API
데이터 형식 HTML (정리 필요) JSON (바로 사용 가능)
안정성 사이트 변경 시 깨짐 버전 관리로 안정적
속도 HTML 파싱으로 느림 필요한 데이터만 빠르게
합법성 회색 지대 공식적으로 허용
제한 차단될 수 있음 호출 횟수 제한(Rate Limit)

결론: API가 있으면 API를 사용하세요! 없을 때만 스크래핑을 고려합니다.


직접 해보기

문제 1: 게시글 상세 조회

JSONPlaceholder API에서 게시글 ID 5번의 제목과 본문을 출력하세요.

URL: https://jsonplaceholder.typicode.com/posts/5
정답 보기
import requests
‍
url = "https://jsonplaceholder.typicode.com/posts/5"
response = requests.get(url)
post = response.json()
‍
print(f"제목: {post['title']}")
print(f"본문: {post['body']}")

문제 2: 댓글 수집

게시글 1번에 달린 모든 댓글의 작성자 이메일과 내용을 출력하세요.

URL: https://jsonplaceholder.typicode.com/posts/1/comments
정답 보기
import requests
‍
url = "https://jsonplaceholder.typicode.com/posts/1/comments"
response = requests.get(url)
comments = response.json()
‍
for i, comment in enumerate(comments, 1):
    print(f"#{i} {comment['email']}")
    print(f"   {comment['body'][:50]}...")
    print()

문제 3: 여러 도시 날씨

Open-Meteo API를 사용해 서울, 부산, 제주의 현재 온도를 비교하세요.

정답 보기
import requests
‍
cities = {
    "서울": (37.5665, 126.9780),
    "부산": (35.1796, 129.0756),
    "제주": (33.4996, 126.5312)
}
‍
url = "https://api.open-meteo.com/v1/forecast"
‍
for city, (lat, lon) in cities.items():
    params = {
        "latitude": lat,
        "longitude": lon,
        "current_weather": True
    }
    response = requests.get(url, params=params)
    data = response.json()
    temp = data["current_weather"]["temperature"]
    print(f"{city}: {temp}°C")

오늘의 정리

개념 설명
API 프로그램끼리 데이터를 주고받는 약속된 방법
REST API HTTP 메서드(GET, POST 등)로 통신하는 API 방식
JSON API가 주고받는 데이터 형식 (딕셔너리와 유사)
requests.get() API에 GET 요청을 보내 데이터 조회
response.json() 응답을 파이썬 딕셔너리/리스트로 변환
API 키 인증을 위한 고유 키 (환경 변수로 관리)

다음 편 예고

다음 편에서는 알고리즘 기초를 다룹니다. 정렬과 탐색 알고리즘을 직접 구현하며, 코딩 테스트의 기본기를 잡아봅시다!


파이썬 Python 파이썬독학 API REST JSON requests 공공API 파이썬실전 IT교육

반응형

댓글