FastAPI 서버개발, 배포, 의존 라이브러리 관리

FastAPI는 현대 웹 API를 구축하기 위해 설계된 고속 웹 프레임워크로, 파이썬의 타입 힌트를 활용하여 개발 효율성과 코드 품질을 한층 끌어올립니다. 본 글에서는 FastAPI의 기본 개념부터 시작하여, 서버 배포, 의존 라이브러리 관리에 대한 체계적인 설명과 함께 실용적인 예제 코드를 제공합니다.

1. FastAPI 소개

FastAPI는 비동기 프로그래밍을 지원하며, Python 3.6 이상에서 작동합니다. 이는 Starlette와 Pydantic을 기반으로 하며, 다음과 같은 특징을 가지고 있습니다:

  • 빠른 성능: FastAPI는 NodeJS의 Express, Go의 Gin과 같은 다른 프레임워크와 유사한 성능을 자랑합니다.
  • 자동화된 문서화: OpenAPI 및 JSON Schema를 기반으로 하여 자동으로 API 문서화가 이루어집니다.
  • 유효성 검사 및 직렬화: Pydantic을 사용하여 데이터 유효성 검사 및 직렬화를 지원합니다.

2. FastAPI 설치 및 기본 설정

FastAPI를 설치하기 위해 아래의 pip 명령어를 사용할 수 있습니다.

pip install fastapi uvicorn

2.1. 간단한 FastAPI 애플리케이션 만들기

아래의 코드는 기본적인 FastAPI 서버의 구조를 보여줍니다. 이 예제에서는 ‘/items/{item_id}’ 경로로 GET 요청을 처리하는 간단한 애플리케이션을 생성합니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

2.2. 서버 실행

위 코드를 main.py로 저장한 후 아래의 명령어로 서버를 실행합니다.

uvicorn main:app --reload

3. API 문서 자동 생성

FastAPI는 자동으로 API 문서를 생성하며, 브라우저에서 http://127.0.0.1:8000/docs에 접속하여 Swagger UI를 확인할 수 있습니다. 또한 http://127.0.0.1:8000/redoc를 통해 ReDoc 형식으로도 확인할 수 있습니다. 이는 개발 시 큰 도움이 되며, 클라이언트와의 소통에도 유용합니다.

4. 데이터 모델링과 Pydantic

FastAPI는 Pydantic을 이용하여 데이터 유효성을 검사하고 모델링을 지원합니다. 다음은 Pydantic을 사용하여 데이터 모델을 정의하는 예제입니다.

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
async def create_item(item: Item):
    return item

5. 의존성 주입

FastAPI는 의존성 주입을 통해 필요한 부분에서 최적의 코드 재사용성을 제공합니다. 아래는 의존성을 사용하여 데이터베이스 연결을 처리하는 예제입니다.

from fastapi import Depends

def get_query(q: str = None):
    return q

@app.get("/items/")
async def read_items(q: str = Depends(get_query)):
    return {"q": q}

6. 배포

FastAPI 애플리케이션을 배포하기 위해 여러 방법이 있으며, 일반적으로는 Docker와 클라우드 서비스 (AWS, GCP, Azure 등)를 사용합니다. 아래는 Docker를 이용한 배포 예시입니다.

6.1. Dockerfile 작성하기

프로젝트 루트 디렉토리에 Dockerfile을 생성하고 아래와 같이 작성합니다.

FROM python:3.9

WORKDIR /app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY ./ ./

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

6.2. Docker Compose 설정

Docker Compose를 사용하면 여러 컨테이너를 관리하기 용이합니다. 아래는 예시 docker-compose.yml 파일입니다.

version: '3.8'

services:
  fastapi:
    build: .
    ports:
      - "8000:80"

6.3. 배포하기

Docker를 이용한 애플리케이션의 배포는 다음과 같은 명령어로 실행할 수 있습니다:

docker-compose up --build

7. 의존 라이브러리 관리

의존 라이브러리를 관리하기 위해 requirements.txt 파일을 사용합니다. 필요한 패키지를 설치 후 pip freeze 명령어로 생성할 수 있습니다.

pip freeze > requirements.txt

7.1. 가상 환경 설정

가상 환경을 통해 프로젝트마다 라이브러리를 독립적으로 관리할 수 있습니다. 아래의 명령어로 가상 환경을 설정하고 활성화할 수 있습니다.

python -m venv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate  # Windows

8. 결론

FastAPI는 데이터 모델링, API 문서화, 의존성 주입 등 다양한 기능을 통해 개발자에게 혜택을 제공합니다. 또한 Docker와의 조합으로 배포 또한 원활하게 이뤄질 수 있습니다. FastAPI를 통해 클린하고 유지보수하기 쉬운 서버 측 애플리케이션을 빠르게 개발할 수 있습니다.

References