Published on

Python API요청 requests&aiohttp 라이브러리 2가지 비교하기

Authors

Python 으로 API 요청을 송수신 할때 requests 혹은 aiohttp 라이브러리를 사용합니다.

두 라이브러리 모두 HTTP 요청을 처리하는데, 차이점을 알아보고 비교합니다.

1. requests

python 으로 HTTP 요청을 보내고 응답을 처리할 수 있는 매우 간편한 라이브러리 입니다.

비개발자분들이 python 간단한 API 요청을 구현할 때 한번쯤 써봤을 것 입니다.

requests는 일반적인 python 과 동일하게 동기 방식을 사용합니다.

아래는 requests로 api.example.com/data 에 get 방식으로 요청을 보내는 코드 예시입니다.

import requests
response = requests.get('https://api.example.com/data')
response.json()

이뿐 아니라

GET, POST, PUT, DELETE 등과 같은 모든 주요 HTTP 메소드를 지원하고 커스텀 헤더와 데이터를 전송할 수 있기에 사용함에 있어서 매우 편리합니다.

2. aiohttp

aiohttp는 Python의 asyncio 라이브러리를 사용하여 비동기 HTTP 클라이언트 및 서버 기능을 제공합니다.

여러 HTTP 요청을 병렬로 처리하여 여러 네트워크 요청을 효율적으로 처리할 수 있습니다.

아래는 aiohttp로 api.example.com/data 에 get 방식으로 요청을 보내는 코드 예시입니다.

import aiohttp

async with aiohttp.ClientSession() as session:
  async with session.get('https://api.example.com/data') as response:
    return await response.json()

requests와 비교했을때 응답에 대한 response에 await을 사용했습니다.

2.1 await response.json()

await를 사용해 일시 중지하는 것입니다.

await 다음에 오는 함수 호출이 완료될 때까지 현재의 비동기 함수의 실행을 일시 중지합니다.

내부적으로는 비동기 함수가 await 을 만나면, asyncio 라이브러리에 의해 관리되는 이벤트 루프에 제어권을 넘깁니다.

그래서 이벤트 루프는 다른 비동기 작업을 실행할 수 있는 것 입니다.

그 응답을 이 완료되면 API 요청에 대한 응답 값이 Return 됩니다.

3. requests aiohttp 비교

requests 라이브러리와 aiohttp 라이브러리를 유형/사용 사례/성능/사용성/웹소켓지원 여부로 구분했습니다.

기준requestsaiohttp
유형동기 HTTP 클라이언트비동기 HTTP 클라이언트/서버
주요 사용 사례간단한 API 호출, 웹 스크래핑고성능 네트워크 작업, 대규모 서비스, 실시간 데이터 처리
성능단일 요청에 대한 블로킹 방식여러 요청에 대한 비동기 처리
사용성간단하고 직관적인 API비동기 프로그래밍에 대한 이해 필요
웹소켓 지원지원하지 않음지원함

3.1 언제 aiohttp 를 사용할까?

python 을 사용하면서 의식적으로 비동기 프로그래밍을 사용한적 없다면 모든 로직이 동기방식으로 작동했을 것 입니다.

requests 도 그 중 하나 입니다.

이것이 의미하는 것은 ' HTTP 요청을 보낼 때, 응답을 받을 때까지 다른 작업을 수행할 수 없다'는 것 입니다.

이는 사용이 간단하고 직관적이며, 일반적인 웹 API 통신에 매우 적합합니다. 그러나 동시에 여러 요청을 처리하는 데는 효율적이지 않습니다.

반면, aiohttp는 비동기 방식으로 작동합니다.

이는 여러 HTTP 요청을 동시에 보내고, 각각의 요청이 독립적으로 처리되는 동안 다른 작업을 계속할 수 있음을 의미합니다.

이는 고성능이 요구되거나 여러 네트워크 연결을 동시에 관리해야 하는 경우에 유리합니다. 그러나 비동기 프로그래밍에 대한 추가적인 이해가 필요합니다.

3.2 FastAPI에서 추천

FastAPI 공식문서

만약 FastAPI를 사용해 웹애플리케이션을 개발한다면, aiohttp를 사용하는 것이 권장됩니다.

aiohttp는 FastAPI의 비동기 아키텍처와 잘 호환됩니다.

FastAPI 내부에서 비동기 네트워크 요청을 할 때 aiohttp를 사용하면, FastAPI의 비동기 이벤트 루프에 맞게 최적화된 요청을 할 수 있습니다.

3.3 FastAPI에서 다른 HTTP 클라이언트 라이브러리

무조건 FastAPI에서 aiohttp 만 사용할 수 있는 것은 아닙니다.

  1. 동기 라이브러리 requests
    • requests와 같은 동기 HTTP 클라이언트 라이브러리를 사용할 수 있습니다.
    • 동기 라이브러리를 사용할 때 주의할 점은 FastAPI의 이벤트 루프가 차단될 수 있다는 것입니다. 즉, 한 요청이 처리되는 동안 다른 요청을 처리할 수 없게 됩니다. 성능 문제를 발생시킬 수 있습니다.
  2. 비동기 라이브러리 aiohttp, httpx
    • aiohttp 외에도 httpx는 또 다른 인기 있는 비동기 HTTP 클라이언트입니다.
    • 이러한 라이브러리는 FastAPI의 비동기 모델과 잘 호환되어, 서버의 동시성과 성능을 개선할 수 있습니다.

hongreat 블로그의 글을 봐주셔서 감사합니다!