파이썬으로 외부 API를 호출할 때는 네트워크 지연과 서버 오류에 대비해 안전한 예외 처리와 타임아웃 설정을 함께 구현해야 합니다. 이번 글에서는 requests 라이브러리를 사용해 데이터를 조회하고 전송하는 구체적인 방법을 다룹니다.
실행 환경 및 준비물
이번 예제는 파이썬 3.8 이상 환경을 기준으로 합니다. HTTP 요청을 간편하게 처리하기 위해 requests 라이브러리를 사용하므로 사전에 설치가 필요합니다.
script.shBASH
pip install requests
기본 API 호출 완성 코드
관련 글: 공공 데이터 API 호출
공개된 더미 API 서버에 GET 요청을 보내고 응답받은 데이터를 파싱하여 출력하는 전체 파이썬 소스 코드입니다.
api_client.pyPYTHON
import requests
def fetch_user_data(user_id):
url = f"https://jsonplaceholder.typicode.com/users/{user_id}"
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:
print("네트워크 연결에 실패했습니다.")
except requests.exceptions.Timeout:
print("요청 시간이 초과되었습니다.")
except requests.exceptions.RequestException as err:
print(f"기타 오류 발생: {err}")
return None
if __name__ == "__main__":
user_id = 1
result = fetch_user_data(user_id)
if result:
print(f"사용자 이름: {result.get('name')}")
print(f"이메일: {result.get('email')}")
코드 주요 구성 요소 설명
관련 글: 응답 데이터를 안전하게 파싱
- requests.get 함수로 지정된 URL에 HTTP GET 요청을 전송합니다.
- timeout 인자를 추가하여 무한정 대기 상태에 빠지는 현상을 방지합니다.
- raise_for_status 메서드는 400번대나 500번대 상태 코드가 반환될 때 HTTPError 예외를 발생시킵니다.
- response.json 메서드는 수신한 JSON 문자열을 파이썬 딕셔너리 자료형으로 자동 변환합니다.
POST 요청 전송 방법
데이터를 생성하거나 서버로 전송할 때는 requests.post 메서드에 json 인자를 전달하여 요청 본문을 구성할 수 있습니다.
api_post.pyPYTHON
import requests
def create_post():
url = "https://jsonplaceholder.typicode.com/posts"
payload = {
"title": "파이썬 API 호출 예제",
"body": "requests 라이브러리 활용법입니다.",
"userId": 1
}
try:
response = requests.post(url, json=payload, timeout=5)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"전송 실패: {e}")
return None
if __name__ == "__main__":
res = create_post()
if res:
print(f"생성된 게시물 ID: {res.get('id')}")
TIP
API 호출 시 인증 토큰이 필요한 경우 headers 파라미터에 {‘Authorization’: ‘Bearer YOUR_TOKEN’} 형태의 딕셔너리를 전달하면 됩니다.
자주 묻는 질문
타임아웃 설정을 반드시 해야 하나요?
서버 응답이 늦어지거나 네트워크 환경이 불안정할 때 프로그램이 멈추는 현상을 막기 위해 timeout 값을 지정하는 것이 좋습니다.
JSONDecodeError가 발생하면 어떻게 하나요?
response.json() 호출 전 서버가 빈 응답을 반환했거나 올바른 JSON 형식인지 확인하고, text 속성을 먼저 출력해 응답 내용을 점검해 보세요.
실전 적용을 위한 점검 사항
외부 API 연동 코드를 실제 서비스에 반영할 때는 예외 처리 범위와 타임아웃 세부 수치를 운영 환경의 특성에 맞게 조정해야 합니다. 특히 인증 정보가 담긴 토큰이나 민감한 파라미터는 소스 코드에 직접 노출하지 않고 환경 변수로 분리하여 관리하는 보안 습관이 필수적입니다.
서버가 반환하는 응답 데이터의 구조가 변경될 가능성에 대비해 파싱 단계에서 안전하게 키를 조회하는 방식을 유지하세요. 오늘 다룬 기본적인 GET과 POST 요청 패턴을 바탕으로, 실제 연동하려는 서비스의 문서와 응답 규격을 확인하며 코드를 확장해 나가길 권장합니다.
완성 코드 예제
안전한 API 연동을 위한 실전 점검
외부 API 연동 코드를 실제 서비스에 반영할 때는 예외 처리 범위와 타임아웃 세부 수치를 운영 환경 특성에 맞게 조정해야 합니다. 특히 인증 토큰이나 민감한 파라미터는 소스 코드에 직접 노출하지 않고 환경 변수로 분리하여 관리하는 보안 습관이 필수적입니다.
서버가 반환하는 응답 데이터 구조가 변경될 가능성에 대비해 파싱 단계에서 안전하게 키를 조회하는 방식을 유지하세요. 오늘 다룬 기본적인 GET과 POST 요청 패턴을 바탕으로, 연동하려는 서비스의 공식 문서와 응답 규격을 대조하며 코드를 확장해 나가길 권장합니다.
참고자료
jsonplaceholder.typicode.com — 사용자 데이터를 조회하는 GET 요청 예제에서 실존하는 더미 API 경로로 활용되었습니다.
jsonplaceholder.typicode.com — 데이터를 생성하고 서버로 전송하는 POST 요청 예제의 대상 엔드포인트로 활용되었습니다.
