파이썬을 이용해 외부 웹 API를 호출하는 작업은 데이터 수집과 연동의 기본입니다. 내장 라이브러리 대신 널리 쓰이는 requests 패키지를 사용하면 간결한 코드로 HTTP 요청을 보낼 수 있습니다.
실행 환경 및 준비물
이 예제를 실행하려면 파이썬 3.7 이상 버전이 필요합니다. HTTP 요청을 간편하게 처리하기 위해 requests 라이브러리 설치가 선행되어야 합니다.
pip install requests
API 호출 완성 코드
다음은 공개된 테스트용 JSONPlaceholder API를 호출하여 게시글 목록을 가져오는 파이썬 스크립트입니다. 예외 처리를 포함하여 네트워크 오류나 잘못된 응답에 대비했습니다.
api_client.pyPYTHON
import requests
def fetch_posts():
url = "https://jsonplaceholder.typicode.com/posts"
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
data = response.json()
return data
except requests.exceptions.HTTPError as http_err:
print(f"HTTP 오류 발생: {http_err}")
except requests.exceptions.ConnectionError as conn_err:
print(f"연결 오류 발생: {conn_err}")
except requests.exceptions.Timeout:
print("요청 시간 초과")
except Exception as err:
print(f"기타 오류 발생: {err}")
return None
if __name__ == "__main__":
posts = fetch_posts()
if posts:
print(f"총 {len(posts)}개의 게시글을 불러왔습니다.")
for post in posts[:3]:
print(f"- {post['title']}")
코드 주요 구간 설명
관련 글: 외부 API 호출
- requests.get(url, timeout=5): 지정된 엔드포인트로 GET 요청을 보냅니다. 타임아웃을 설정해 무한 대기 상태를 방지합니다.
- response.raise_for_status(): 상태 코드가 400번대나 500번대일 경우 HTTPError 예외를 발생시킵니다.
- response.json(): 서버가 반환한 JSON 문자열을 파이썬의 딕셔너리 또는 리스트 객체로 변환합니다.
TIP
API 키나 인증 토큰이 필요한 경우 requests.get 함수 호출 시 headers={‘Authorization’: ‘Bearer YOUR_TOKEN’} 인자를 추가하여 전달하세요.
자주 발생하는 오류와 해결 방법
관련 글: 오류와 해결 방법
requests.exceptions.ConnectionError 오류가 납니다.
요청 대상 서버의 도메인 주소가 잘못되었거나 방화벽이 차단하고 있을 때 발생합니다. 주소 오타를 확인하고 인터넷 연결 상태를 점검하세요.
Timeout 예외가 자주 발생합니다.
서버 응답 속도가 느릴 때 발생합니다. timeout 파라미터 값을 늘리거나 서버 상태를 확인해야 합니다.
핵심 요약
완성 코드 예제
핵심 정리
공공 데이터나 외부 API를 연동할 때는 네트워크 불안정이나 잘못된 응답 형식 같은 예외 상황을 코드 단계에서 미리 대비하는 편이 안전합니다. 특히 타임아웃 설정과 HTTP 상태 코드 검증은 서비스 안정성을 높이는 가장 기본적인 장치입니다.
실제 프로젝트에 적용할 때는 인증 방식과 응답 데이터 구조가 문서와 일치하는지 먼저 확인하세요. 작은 단위의 예외 처리 코드가 쌓이면 운영 중 발생하는 예기치 못한 중단 사고를 효과적으로 예방할 수 있습니다.
참고자료
jsonplaceholder.typicode.com — 공개된 테스트용 JSONPlaceholder API의 전체 게시글 목록을 가져오기 위한 기본 엔드포인트로 사용됩니다.
jsonplaceholder.typicode.com — 불러오는 데이터의 양을 제한하여 테스트할 때 참고할 수 있는 API 엔드포인트 후보입니다.
