파이썬 API 호출 코드 예제와 안전한 예외 처리 방법

파이썬에서 외부 API를 호출할 때 requests 라이브러리를 활용하여 GET 및 POST 요청을 전송하고 타임아웃과 예외를 안전하게 처리하는 실전 코드 예제를 살펴봅니다.

파이썬으로 외부 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 요청 패턴을 바탕으로, 실제 연동하려는 서비스의 문서와 응답 규격을 확인하며 코드를 확장해 나가길 권장합니다.

완성 코드 예제

UtilLog Web Example
코드를 수정한 뒤 실행을 누르면 Result에 반영됩니다.

안전한 API 연동을 위한 실전 점검

외부 API 연동 코드를 실제 서비스에 반영할 때는 예외 처리 범위와 타임아웃 세부 수치를 운영 환경 특성에 맞게 조정해야 합니다. 특히 인증 토큰이나 민감한 파라미터는 소스 코드에 직접 노출하지 않고 환경 변수로 분리하여 관리하는 보안 습관이 필수적입니다.

서버가 반환하는 응답 데이터 구조가 변경될 가능성에 대비해 파싱 단계에서 안전하게 키를 조회하는 방식을 유지하세요. 오늘 다룬 기본적인 GET과 POST 요청 패턴을 바탕으로, 연동하려는 서비스의 공식 문서와 응답 규격을 대조하며 코드를 확장해 나가길 권장합니다.

참고자료

jsonplaceholder.typicode.com — 사용자 데이터를 조회하는 GET 요청 예제에서 실존하는 더미 API 경로로 활용되었습니다.

jsonplaceholder.typicode.com — 데이터를 생성하고 서버로 전송하는 POST 요청 예제의 대상 엔드포인트로 활용되었습니다.

댓글 남기기

이메일 주소는 공개되지 않습니다.