FastAPI 서버개발, 비동기 함수 및 코루틴 사용법

저자: AI 작성자

날짜: 2023년 10월

1. 서론

FastAPI는 Python으로 작성된 최신 웹 프레임워크로, 비동기 프로그래밍을 지원하여 높은 성능을 제공합니다. 본 강좌에서는 FastAPI를 사용하여 백엔드 서버를 개발하고, 비동기 함수 및 코루틴을 활용하는 방법에 대해 자세히 설명하겠습니다. 이 글에서는 FastAPI의 기본 개념뿐 아니라 비동기 프로그래밍의 원리와 장점, 그리고 이를 활용한 실제 예제 코드를 제공합니다.

2. FastAPI 소개

FastAPI는 Python의 비동기 기능을 최대한 활용하면서도 쉽고 빠르게 API를 구축할 수 있도록 설계되었습니다.

  • 비동기 지원: asyncio 라이브러리를 사용하여 비동기로 작동
  • 자동화된 문서화: OpenAPI 스펙에 따라 API 문서를 자동으로 생성
  • 유효성 검사: Pydantic을 사용하여 데이터 유효성 검사 및 직렬화를 제공
  • 성능: 비동기 처리를 통해 높은 성능을 자랑

3. 비동기 프로그래밍 개념

비동기 프로그래밍은 전통적인 동기 프로그래밍과 달리 여러 작업을 동시에 진행할 수 있는 구조입니다. 이는 네트워킹 및 I/O 작업과 같이 지연이 생기는 작업에서 속도 향상을 가져옵니다. 비동기 프로그래밍의 주요 개념은 다음과 같습니다.

  • 코루틴(Coroutine): Python의 async/await 구문을 사용하여 비동기 함수를 정의할 수 있습니다. 코루틴은 다른 코루틴에 의해 중단되고, 다시 재개될 수 있는 함수를 의미합니다.
  • 이벤트 루프(Event Loop): 비동기 프로그래밍의 핵심으로, 여러 비동기 작업을 스케줄링하고 관리하는 역할을 합니다.
  • Task: 코루틴을 이벤트 루프에서 실행하기 위해 생성되는 객체로, 실행할 코루틴을 감싸고 있습니다.

4. FastAPI 설치

FastAPI를 사용하기 위해서는 먼저 Python을 설치해야 합니다. 그 후, FastAPI와 필요한 라이브러리를 설치할 수 있습니다. 다음 명령어를 사용하여 FastAPI를 설치합니다.


pip install fastapi uvicorn
            

uvicorn은 ASGI 서버로 FastAPI 앱을 실행하는 데 필요합니다.

5. FastAPI의 기본 사용법

FastAPI의 기본 구조는 매우 간단합니다. 아래의 코드 예제는 기본적인 FastAPI 애플리케이션을 생성하는 예입니다.


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}
            

위의 예제에서 FastAPI 인스턴스를 생성하고, GET 요청에 대한 기본 응답을 정의하는 코루틴을 작성했습니다. 이제 서버를 실행해보겠습니다.


uvicorn main:app --reload
            

기본적으로 서버는 http://localhost:8000에서 실행됩니다. 웹 브라우저에서 해당 URL로 접속하면 JSON 형식의 {“Hello”: “World”} 응답을 확인할 수 있습니다.

6. 비동기 함수 및 코루틴

FastAPI에서는 비동기 함수와 코루틴을 쉽게 사용할 수 있습니다. 다음은 비동기 함수의 몇 가지 예제입니다. 이를 통해 비동기 작업을 어떻게 구현할 수 있는지 살펴보겠습니다.


import asyncio

async def fake_blocking_task():
    await asyncio.sleep(2)  # 2초 대기
    return "이 작업은 비동기적으로 실행됩니다."

@app.get("/async-task")
async def run_async_task():
    result = await fake_blocking_task()
    return {"result": result}
            

위 코드는 fake_blocking_task 함수를 비동기적으로 실행하며, 2초 후에 응답을 생성합니다. 클라이언트는 다른 요청을 처리하는 동안 이 작업이 백그라운드에서 진행됩니다.

7. 비동기 데이터베이스 작업

FastAPI는 데이터베이스와의 비동기 통신을 지원합니다. 예를 들어, SQLAlchemy를 사용해 비동기 작업을 수행할 수 있습니다. 다음은 SQLAlchemy를 사용하여 비동기적으로 데이터베이스와 상호작용하는 방법입니다.


from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "sqlite+aiosqlite:///./test.db"

engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(
    bind=engine,
    expire_on_commit=False,
    class_=AsyncSession
)

async def get_items():
    async with async_session() as session:
        result = await session.execute(select(Item))
        return result.scalars().all()
            

위의 예제에서는 SQLAlchemy의 비동기 세션을 사용하여 데이터베이스에 접근하는 방법을 보여줍니다. 비동기적으로 SQL 쿼리를 실행하고 결과를 반환합니다.

8. FastAPI에서 종속성 주입 사용하기

FastAPI는 종속성 주입 시스템을 통해 코드의 재사용성과 구조적인 설계를 지원합니다. 예를 들어, 데이터베이스 세션을 전역 설정으로 주입할 수 있습니다.


from fastapi import Depends

async def get_db():
    async with async_session() as session:
        yield session

@app.get("/items/")
async def read_items(db: AsyncSession = Depends(get_db)):
    items = await get_items()
    return items
            

위 코드에서 Depends를 사용하여 종속성 주입을 구현합니다. 클라이언트 요청에 대해 데이터베이스 세션이 사용됩니다.

9. 테스트 작성하기

FastAPI는 테스트 작성도 간단하게 만들어 줍니다. 다음은 테스트 코드의 예입니다.


from fastapi.testclient import TestClient

client = TestClient(app)

def test_read_root():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"Hello": "World"}
            

FastAPI의 내장 TestClient를 사용하여 엔드포인트를 테스트할 수 있습니다.

10. 결론

FastAPI를 사용한 비동기 함수 및 코루틴 활용은 현대적인 웹 개발에서 필수적인 작업입니다. 이는 성능을 최적화하고, 확장 가능한 애플리케이션을 개발하는 데 큰 도움이 됩니다. 본 강좌를 통해 FastAPI의 기본 사용법부터 비동기 프로그래밍의 개념, 그리고 데이터베이스와의 상호작용까지 폭넓은 내용을 다루었습니다.

FastAPI는 지속적으로 발전하고 있으며, 앞으로도 많은 기능들이 추가될 것입니다. 여러분도 FastAPI를 활용하여 효율적이고 빠른 웹 애플리케이션을 개발해보시기 바랍니다.

본 글은 FastAPI를 활용한 서버 개발 및 비동기 프로그래밍에 대한 체계적인 안내서입니다. FastAPI의 공식 문서도 참고하시기 바랍니다.

문의 사항이 있으시면 댓글로 남겨주세요!