FastAPI 서버개발, 배포 준비

FastAPI는 Python으로 작성된 현대적인 웹 프레임워크로, 빠른 성능과 직관적인 사용성을 제공하여 RESTful API 서버를 구축하는 데 매우 유용합니다. 이 글에서는 FastAPI 서버를 개발하는 방법뿐만 아니라, 배포 준비 과정에 대해서도 상세히 설명하겠습니다.

FastAPI의 주요 특징

  • 빠른 성능: FastAPI는 Starlette와 Pydantic을 기반으로 하여 매우 빠른 성능을 제공합니다.
  • 자동 문서화: Swagger UI와 ReDoc을 통해 API 문서를 자동으로 생성합니다.
  • 비동기 처리 지원: Python의 비동기 프로그래밍을 쉽게 사용할 수 있습니다.
  • 타입 힌트: Python의 타입 힌트를 사용하여 코드의 가독성과 안정성을 높일 수 있습니다.

FastAPI 서버 개발 시작하기

FastAPI를 사용하여 간단한 웹 서버를 구축해보겠습니다. 이 예제에서는 간단한 사용자 등록 API를 만들어 보겠습니다.

1. FastAPI 설치

FastAPI를 설치하려면 pip를 사용합니다. 또한, Uvicorn을 ASGI 서버로 사용해 실행할 수 있습니다.

pip install fastapi uvicorn

2. FastAPI 앱 만들기

FastAPI 앱을 정의하고, 사용자 등록 API를 구현해보겠습니다.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    username: str
    email: str

@app.post("/register/")
async def register_user(user: User):
    return {"message": f"User {user.username} registered successfully!", "email": user.email}

3. 서버 실행하기

Uvicorn을 사용하여 서버를 실행합니다. 아래 명령어를 터미널에 입력하면 서버가 시작됩니다.

uvicorn main:app --reload

위 명령으로 `/register/` 엔드포인트가 활성화되며, 이를 통해 사용자 정보를 POST 방식으로 전송할 수 있습니다.

FastAPI 앱의 구조

FastAPI 앱은 보통 다음과 같은 구조로 구성됩니다:

my_fastapi_app/
|-- main.py
|-- models/
|   |-- __init__.py
|   |-- user.py
|-- routers/
|   |-- __init__.py
|   |-- user.py
|-- utils/
|   |-- __init__.py
|   |-- helpers.py

모듈화된 FastAPI 앱 개발

서버가 커질수록 모듈화된 구조가 중요합니다. 각 노력별로 파일을 나누어 관리하면 유지보수와 코드 가독성을 높일 수 있습니다.

1. 모델 정의하기

모델을 정의하는 `user.py` 파일은 아래와 같습니다:

from pydantic import BaseModel

class User(BaseModel):
    username: str
    email: str

2. 라우터 정의하기

라우터를 정의하는 `routers/user.py` 파일:

from fastapi import APIRouter
from models.user import User

router = APIRouter()

@router.post("/register/")
async def register_user(user: User):
    return {"message": f"User {user.username} registered successfully!", "email": user.email}

3. 메인 앱에 라우터 추가하기

메인 앱 파일인 `main.py`에서 라우터를 포함하는 방법:

from fastapi import FastAPI
from routers import user

app = FastAPI()
app.include_router(user.router)

환경 설정

FastAPI 애플리케이션의 환경 설정을 위해 `dotenv`를 사용하여 환경 변수를 관리하는 것이 좋습니다. 아래와 같이 설정할 수 있습니다.

1. python-dotenv 설치

pip install python-dotenv

2. .env 파일 생성

DATABASE_URL=mysql://user:password@localhost:3306/mydatabase

3. 환경 변수 사용하기

import os
from dotenv import load_dotenv

load_dotenv()
database_url = os.getenv("DATABASE_URL")

FastAPI 배포 준비

FastAPI 서버를 배포하기 위한 방법을 설명합니다. 아래 단계로 진행할 수 있습니다.

1. 배포 환경 선택

FastAPI 애플리케이션은 여러 클라우드 서비스 제공업체에서 배포할 수 있습니다. 예를 들어, AWS, GCP, 또는 DigitalOcean과 같은 서비스에서 VM을 생성하여 배포할 수 있습니다.

2. Gunicorn 설치

FastAPI 애플리케이션을 프로덕션 환경에서 실행하기 위해 Gunicorn을 설치할 수 있습니다.

pip install gunicorn

3. 배포 스크립트 작성

배포 스크립트를 작성하여 서버를 배포할 수 있습니다. 다음의 예시와 같이 `start.sh` 파일을 생성하세요:

#!/bin/bash
uvicorn main:app --host 0.0.0.0 --port 8000 --reload

이 스크립트로 서버를 실행할 수 있습니다.

4. Reverse Proxy 설정 (선택 사항)

NGINX와 같은 Reverse Proxy 서버를 설정하여 FastAPI 서버의 앞단에 두면 보안과 성능을 향상시킬 수 있습니다.

테스트 및 모니터링

코드 배포 후에는 API의 기능이 올바르게 동작하는지 확인하고, 모니터링 도구를 사용하여 성능을 관찰해야 합니다.

1. 테스트 프레임워크 설정

FastAPI는 Pytest와 함께 사용할 수 있습니다. 아래는 간단한 테스트 예제입니다:

from fastapi.testclient import TestClient
from main import app

client = TestClient(app)

def test_register_user():
    response = client.post("/register/", json={"username": "testuser", "email": "test@example.com"})
    assert response.status_code == 200
    assert response.json() == {"message": "User testuser registered successfully!", "email": "test@example.com"}

2. 모니터링 도구

서버의 상태와 성능을 모니터링하기 위해 Prometheus와 Grafana를 사용할 수 있습니다.

결론

이 글에서는 FastAPI를 사용한 서버 개발 과정과 배포 준비 방법에 대해 설명했습니다. FastAPI의 강력한 기능과 유연한 구조 덕분에 현업에서 RESTful API를 효과적으로 구축할 수 있습니다. 배포 후에는 성능 모니터링을 통해 안정적인 서비스를 제공하십시오.

참고 자료