기술 리뷰 및 비교 (Tech Review & Comparison)/프레임워크 비교 분석

FastAPI에서 비동기 프로그래밍의 이해와 활용

코린이ch 2025. 2. 19. 00:19

FastAPI는 최신 Python의 async/await 구문을 적극 활용하여 고성능 API 서버를 쉽게 구축할 수 있도록 도와줍니다. 이 글에서는 FastAPI 공식문서의 비동기(async) 관련 내용을 정리하고, 비동기 프로그래밍의 개념과 FastAPI에서 이를 어떻게 활용할 수 있는지 알아보겠습니다.


1. 비동기 프로그래밍이란?

비동기 프로그래밍은 I/O 작업(예: 데이터베이스 호출, 외부 API 요청, 파일 입출력 등)과 같이 완료되는 데 시간이 걸리는 작업을 처리할 때, 다른 작업을 블로킹하지 않고 동시에 실행할 수 있게 하는 방식입니다.

  • 동기(synchronous) 코드에서는 작업이 순차적으로 처리되어, 하나의 작업이 끝나야 다음 작업이 시작됩니다.
  • 반면, 비동기(asynchronous) 코드는 asyncawait 키워드를 사용해 I/O 작업 중에도 다른 작업을 실행할 수 있도록 합니다.

이러한 방식은 특히 네트워크 요청이나 파일 시스템 접근 등 I/O 바운드 작업에서 성능을 크게 향상시킬 수 있습니다.


2. FastAPI와 비동기 함수

FastAPI에서는 일반적인 동기 함수(def)와 비동기 함수(async def) 모두를 사용할 수 있습니다.

  • 비동기 엔드포인트: async def를 사용하면, 내부에서 await 키워드를 활용해 비동기 I/O 작업을 수행할 수 있습니다.
  • 동기 엔드포인트: 일반적인 def 함수도 문제 없이 사용할 수 있으며, FastAPI는 내부적으로 이를 별도의 쓰레드 풀에서 실행하여 이벤트 루프가 블로킹되지 않도록 합니다.

비동기 함수를 사용하면, 많은 수의 I/O 바운드 요청을 효율적으로 처리할 수 있는 장점이 있습니다.

예제 코드

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/async")
async def read_async():
    # 비동기 I/O 작업 예시: 1초 대기
    await asyncio.sleep(1)
    return {"message": "Hello, async world!"}

위 코드에서 read_async 함수는 async def로 정의되어 있으며, await asyncio.sleep(1)를 통해 1초간 대기하는 비동기 작업을 수행합니다. 이처럼 비동기 함수는 I/O 작업 중에도 다른 요청들을 처리할 수 있게 도와줍니다.


3. 비동기 프로그래밍의 장점과 주의사항

장점

  • 높은 동시성 처리: I/O 바운드 작업이 많은 애플리케이션에서 더 많은 요청을 동시에 처리할 수 있습니다.
  • 자원 효율성: 불필요한 쓰레드 생성 없이 이벤트 루프를 활용하여 자원을 효율적으로 사용할 수 있습니다.

주의사항

  • 외부 라이브러리 지원: 데이터베이스나 HTTP 클라이언트 등 외부 라이브러리가 비동기를 지원해야 비동기 코드를 온전히 활용할 수 있습니다.
  • CPU 바운드 작업: CPU 연산이 많은 작업은 비동기 방식으로 처리해도 큰 이점을 보지 못할 수 있으므로, 이런 경우에는 백그라운드 작업이나 별도 프로세스 활용을 고려해야 합니다.

4. 결론

FastAPI는 동기와 비동기 함수를 모두 지원하여, 개발자가 상황에 맞게 최적의 방식을 선택할 수 있도록 합니다. 특히 I/O 바운드 작업이 많은 서비스에서는 async/await를 활용한 비동기 프로그래밍이 높은 성능과 효율성을 보장합니다.

출처: FastAPI 공식문서 (비동기)