FastAPI 서버개발, 배포, 환경 변수 설정

FastAPI는 현대적인 웹 API를 구축하기 위한 높은 성능과 비동기 기능을 제공하는 Python 웹 프레임워크입니다. 본 글에서는 FastAPI 서버 개발부터 배포, 그리고 환경 변수 설정까지의 전 과정을 자세히 살펴보도록 하겠습니다.

1. FastAPI 소개

FastAPI는 Python 3.6 이상에서 사용 가능하며, Starlette과 Pydantic을 기반으로 설계되었습니다. 주된 특징으로는 자동 API 문서 생성, 유효성 검사, 비동기 지원, 높은 성능 등이 있습니다. 이러한 특징 덕분에 FastAPI는 RESTful API, Microservices, 데이터 처리 애플리케이션 등을 만드는 데 적합합니다.

2. FastAPI 설치

FastAPI는 PyPI에서 쉽게 설치할 수 있습니다. 아래 명령어를 사용하여 FastAPI와 ASGI 서버인 uvicorn을 설치합니다:

pip install fastapi uvicorn

3. FastAPI 기본 구조

FastAPI 애플리케이션은 기본적으로 다음과 같은 구조를 가집니다.

my_fastapi_app/
├── main.py
└── requirements.txt

디렉토리 구조를 만들었다면, 빠른 시작을 위한 예제 코드를 작성해보겠습니다.

# main.py
from fastapi import FastAPI

app = FastAPI()

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

이제 아래 명령어로 FastAPI 서버를 실행합니다:

uvicorn main:app --reload

서버가 실행되면, http://127.0.0.1:8000/docs를 통해 자동으로 생성된 API 문서를 확인할 수 있습니다.

4. RESTful API 개발

4.1. CRUD API 구현

이제 간단한 CRUD(Create, Read, Update, Delete) API를 만들어보겠습니다.

# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List

app = FastAPI()

class Item(BaseModel):
    id: int
    name: str
    description: str

items = []

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

@app.get("/items/", response_model=List[Item])
async def read_items():
    return items

@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int):
    for item in items:
        if item.id == item_id:
            return item
    raise HTTPException(status_code=404, detail="Item not found")

@app.put("/items/{item_id}", response_model=Item)
async def update_item(item_id: int, item: Item):
    for index, existing_item in enumerate(items):
        if existing_item.id == item_id:
            items[index] = item
            return item
    raise HTTPException(status_code=404, detail="Item not found")

@app.delete("/items/{item_id}", response_model=Item)
async def delete_item(item_id: int):
    for index, item in enumerate(items):
        if item.id == item_id:
            return items.pop(index)
    raise HTTPException(status_code=404, detail="Item not found")

4.2. API 테스트

이제 개발한 API를 Postman 또는 cURL을 사용하여 테스트할 수 있습니다. 예를 들어, curl을 이용하여 아이템을 생성하는 방법은 다음과 같습니다.

curl -X POST "http://127.0.0.1:8000/items/" -H "Content-Type: application/json" -d '{"id": 1, "name": "Item 1", "description": "This is item 1."}'

5. 환경 변수 설정

개발 환경에서 중요한 요소 중 하나는 환경 변수를 설정하는 것입니다. FastAPI를 사용할 때도 환경 변수를 설정하여 설정 파일을 분리하고 보안을 강화할 수 있습니다.

5.1. Python-dotenv 라이브러리 설치

환경 변수를 관리하기 위해 python-dotenv 라이브러리를 설치합니다:

pip install python-dotenv

5.2. .env 파일 생성

프로젝트 루트 디렉토리에 .env 파일을 생성하고 여기에 환경 변수를 추가합니다:

DATABASE_URL=mysql://user:password@localhost/dbname
API_KEY=your_api_key

5.3. 환경 변수 로드하기

이제 코드에서 load_dotenv() 함수를 사용하여 환경 변수를 로드할 수 있습니다.

# main.py
import os
from dotenv import load_dotenv

load_dotenv()

DATABASE_URL = os.getenv("DATABASE_URL")
API_KEY = os.getenv("API_KEY")

6. FastAPI 배포

FastAPI 애플리케이션을 배포하는 방법에는 여러 가지가 있습니다. 여기서는 Heroku와 Docker를 이용한 배포 방법을 설명하겠습니다.

6.1. Heroku 배포

Heroku는 클라우드 애플리케이션 플랫폼으로, FastAPI 애플리케이션을 쉽게 배포할 수 있습니다.

heroku create my-fastapi-app
heroku addons:create heroku-postgresql:hobby-dev
git push heroku master

이후, 브라우저에서 https://my-fastapi-app.herokuapp.com와 같은 URL로 FastAPI 애플리케이션에 접근할 수 있습니다.

6.2. Docker 배포

Docker를 사용하면 애플리케이션을 컨테이너로 패키징하여 배포할 수 있습니다. 다음은 Dockerfile 작성 예시입니다.

# Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8

COPY ./app /app

WORKDIR /app

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

이후, 이미지를 빌드하고 실행합니다:

docker build -t my-fastapi-app .
docker run -d -p 80:80 my-fastapi-app

7. 결론

FastAPI는 API 서버를 쉽게 개발하고 배포할 수 있는 강력한 도구입니다. 이 글에서 설명한 내용을 바탕으로 FastAPI를 활용하여 자신의 프로젝트를 구현해보세요. 환경 변수 설정과 같은 유용한 기능을 통해 보안을 강화하고, 다양한 배포 방법을 통해 애플리케이션을 실제 서비스에 적용할 수 있습니다.

이 글이 FastAPI에 대한 이해를 돕고, 여러분의 개발에 실질적인 도움이 되기를 바랍니다.