FastAPI 서버개발, Pydantic을 이용한 데이터 모델링

FastAPI는 현대적인 웹 API를 빠르게 구축할 수 있도록 도와주는 경량의 웹 프레임워크입니다. Python의 비동기 기능을 활용하여 매우 높은 성능을 제공하며, 개발자에게는 사용의 용이성과 명확한 문서화를 제공합니다. 본 글에서는 FastAPI 서버 개발과 Pydantic을 이용한 데이터 모델링에 대해 자세히 설명하겠습니다.

1. FastAPI란?

FastAPI는 Python 3.6 이상의 타입 힌트를 적극적으로 활용하여 API 문서를 자동으로 생성할 수 있는 프레임워크입니다. RESTful API, GraphQL API를 쉽게 만들 수 있으며, 비동기 처리를 지원하여 높은 성능을 제공합니다.

1.1 특징

  • 높은 성능: 스타트업과 규모가 큰 프로젝트에서 동시에 사용할 수 있을 정도로 빠릅니다.
  • 간편한 사용법: Flask와 유사한 방식으로 쉽게 배울 수 있습니다.
  • 자동 문서화: OpenAPI와 JSON Schema를 기반으로 API 문서가 자동으로 생성됩니다.
  • 타입 안전성: Pydantic과의 통합을 통해 데이터 검증과 변환이 매우 쉽고 안전합니다.

2. Pydantic이란?

Pydantic은 Python 데이터 검증 및 설정 관리 도구입니다. Python의 타입 힌트를 활용하여 입력된 데이터의 유효성을 검사하고, 데이터 변환 및 직렬화를 관리합니다. FastAPI는 Pydantic을 모델의 입력 및 출력을 다루는 데 활용합니다.

2.1 Pydantic의 주요 기능

  • 데이터 유효성 검사: 입력된 데이터가 지정된 형식에 맞는지 확인합니다.
  • 데이터 직렬화 및 역직렬화: 모델 인스턴스를 JSON과 같은 형식으로 쉽게 변환할 수 있습니다.
  • 에러 메시지: 데이터 검증 시 쉽게 이해할 수 있는 에러 메시지를 제공합니다.
  • 환경 변수 지원: .env 파일을 통해 환경 변수를 쉽게 로드할 수 있습니다.

3. FastAPI 및 Pydantic 설치하기

FastAPI와 Pydantic은 pip를 통해 쉽게 설치할 수 있습니다. 다음 명령어를 사용하여 설치합니다:

pip install fastapi uvicorn pydantic

여기서 uvicorn은 ASGI 서버로 FastAPI 애플리케이션을 실행하는 데 사용됩니다.

4. FastAPI 서버 개발하기

우선 FastAPI 애플리케이션을 생성한 후, Pydantic 모델을 사용하여 데이터 모델링을 시작합니다. 간단한 예제로 북(Book) API를 만들어보겠습니다.

4.1 FastAPI 애플리케이션 생성

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello, FastAPI!"}

4.2 Pydantic 모델 생성

이제 API에 사용할 Pydantic 모델을 정의해 보겠습니다. 북(Book) 모델을 정의하려면 다음과 같이 작성할 수 있습니다:

from pydantic import BaseModel
from typing import Optional

class Book(BaseModel):
    id: int
    title: str
    author: str
    description: Optional[str] = None
    year: Optional[int] = None

4.3 API 엔드포인트 추가하기

이제 FastAPI 애플리케이션에 북 데이터를 추가하고 가져오는 엔드포인트를 추가합니다:

books = []

@app.post("/books/", response_model=Book)
async def create_book(book: Book):
    books.append(book)
    return book

@app.get("/books/{book_id}", response_model=Book)
async def read_book(book_id: int):
    for book in books:
        if book.id == book_id:
            return book
    return {"error": "Book not found"}

5. API 테스트하기

API를 테스트하기 위해서는 Uvicorn 서버를 실행하고, Postman이나 curl과 같은 도구를 사용할 수 있습니다. 아래 명령어로 서버를 실행합니다:

uvicorn main:app --reload

이제 브라우저에서 http://127.0.0.1:8000/docs에 접속하면 FastAPI가 자동으로 생성한 API 문서를 확인할 수 있습니다.

6. Pydantic의 고급 기능

Pydantic은 단순한 데이터 모델링 외에도 다음과 같은 여러 고급 기능을 제공합니다:

6.1 Validation (유효성 검사)

Pydantic은 유효성 검사기를 사용자 정의하여 제대로 사용하지 않은 형식이나 잘못된 값에 대해 쉽게 제어할 수 있습니다:

from pydantic import constr

class User(BaseModel):
    username: constr(min_length=4, max_length=20)
    email: EmailStr

    class Config:
        anystr_strip_whitespace = True

6.2 Nested Models (중첩 모델)

Pydantic 모델은 서로 중첩될 수 있어 복잡한 데이터 구조를 작업하는 데 매우 유용합니다:

class Publisher(BaseModel):
    name: str
    address: Optional[str] = None

class BookWithPublisher(BaseModel):
    title: str
    author: str
    publisher: Publisher

7. 결론

FastAPI와 Pydantic을 함께 사용하면 효율적이고 강력한 웹 API를 쉽게 구축할 수 있습니다. FastAPI의 비동기 처리 능력과 Pydantic의 데이터 유효성 검사는 개발 생산성을 극대화하는 데 주요한 요소입니다. 본 강좌에서는 간단한 예제를 통해 FastAPI와 Pydantic을 사용하여 데이터 모델링의 기초를 살펴봤습니다. 이를 바탕으로 더 복잡한 API를 설계하고 구현할 수 있습니다. FastAPI와 Pydantic을 통해 여러분의 프로젝트에 강력한 웹 API를 추가해보시기 바랍니다.

8. 참고 자료