FastAPI 서버개발, 도커 이미지 빌드

FastAPI는 현대적인 웹 애플리케이션을 구축하는 데 있어 매우 인기 있는 Python 웹 프레임워크입니다. 이 강좌에서는 FastAPI를 사용하여 간단한 RESTful API를 만들고 이를 Docker를 사용해 배포하는 방법에 대해 설명하겠습니다. FastAPI는 탁월한 성능과 쉬운 사용성을 제공하며, Swagger UI, 자동 문서화 등 다양한 기능을 내장하고 있어 개발자에게 많은 이점을 제공합니다.

목차

1. FastAPI란 무엇인가?

FastAPI는 비동기 프로그래밍을 지원하는 Python 기반의 웹 프레임워크입니다. RESTful API를 쉽고 빠르게 개발할 수 있도록 설계되었습니다. FastAPI의 주요 특징은 다음과 같습니다:

  • 자동 API 문서화: Swagger UI를 통한 자동화된 문서화 지원
  • 높은 성능: Starlette 및 Pydantic을 기반으로 하여 높은 성능을 자랑
  • 비동기 처리 지원: async/await 구문을 이용해 비동기 코드를 쉽게 작성 가능
  • 데이터 검증: Pydantic을 통한 강력한 데이터 검증 기능

2. FastAPI 설치 및 환경 설정

FastAPI를 설치하기 위해서는 Python이 필요합니다. 터미널에서 다음 명령어를 입력하여 FastAPI와 Uvicorn을 설치합니다:

pip install fastapi uvicorn

설치가 완료되면, FastAPI 애플리케이션을 작성할 수 있는 기본 구조를 만듭니다.

mkdir fastapi_docker && cd fastapi_docker
touch main.py

이제 main.py 파일을 열고 기본적인 FastAPI 서버를 작성해 보겠습니다.

FastAPI 기본 서버 예제

from fastapi import FastAPI

app = FastAPI()

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

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

위 코드는 간단한 FastAPI 서버를 정의합니다. / 경로에 GET 요청을 보내면 “Hello, World”라는 JSON 응답을 받고, /items/{item_id} 경로에 GET 요청을 보내면 해당 item_id과 쿼리 매개변수를 포함한 JSON 응답을 반환합니다.

3. FastAPI 애플리케이션 개발

FastAPI 애플리케이션을 좀 더 발전시켜 보겠습니다. 여기서는 간단한 Todo 애플리케이션을 구현해 보겠습니다. 아래는 Todo 애플리케이션의 기본 구조입니다.

Todo 모델 정의

from typing import List, Optional
from pydantic import BaseModel

class TodoItem(BaseModel):
    id: int
    title: str
    completed: bool = False

todos = []

Todo API 엔드포인트 구현

@app.post("/todos/", response_model=TodoItem)
async def create_todo(todo: TodoItem):
    todos.append(todo)
    return todo

@app.get("/todos/", response_model=List[TodoItem])
async def read_todos():
    return todos

@app.delete("/todos/{todo_id}")
async def delete_todo(todo_id: int):
    global todos
    todos = [todo for todo in todos if todo.id != todo_id]
    return {"message": "Todo item deleted"} 

위의 코드에서는 Todo 항목을 생성, 조회 및 삭제할 수 있는 기본적인 REST API 엔드포인트를 제공합니다.

4. Docker 이해하기

Docker는 애플리케이션을 컨테이너로 패키징하고 배포할 수 있는 플랫폼입니다. 컨테이너는 애플리케이션과 그 의존성을 함께 묶어서 어디서든 동일하게 실행될 수 있도록 합니다. Docker를 사용하면 개발, 테스트, 배포 환경을 통일할 수 있으며, 이를 통해 일관성을 유지하고 배포를 용이하게 할 수 있습니다.

5. Dockerfile 작성 및 이미지 빌드

이제 FastAPI 애플리케이션을 Docker로 컨테이너화해 보겠습니다. Dockerfile을 작성하여 FastAPI 애플리케이션을 포함하는 이미지를 빌드할 수 있습니다.

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", "8000"]

requirements.txt 파일에는 FastAPI와 Uvicorn이 포함되어 있어야 합니다.

fastapi
uvicorn

도커 이미지 빌드

이제 도커 이미지를 빌드합니다. 다음 명령어를 터미널에 입력합니다:

docker build -t fastapi-todo .

6. Docker 컨테이너 실행

도커 이미지가 성공적으로 빌드되었다면, 이를 기반으로 컨테이너를 실행할 수 있습니다. 다음 명령어를 입력하여 FastAPI 애플리케이션을 실행합니다:

docker run -d --name fastapi-todo -p 8000:8000 fastapi-todo

이제 웹 브라우저에서 http://localhost:8000/docs에 접속하여 Swagger UI를 통해 API를 테스트할 수 있습니다.

7. 결론 및 다음 단계

이번 강좌에서는 FastAPI를 사용하여 간단한 RESTful API를 개발하고, 이를 도커를 사용해 배포하는 방법에 대해 알아보았습니다. FastAPI는 성능이 뛰어나며 비동기 처리를 쉽게 만들 수 있기 때문에, 더욱 복잡한 애플리케이션 개발에도 적합합니다.

다음 단계로는 인증 및 권한 부여, 데이터베이스 통합 등의 기능을 추가하여 좀 더 발전된 RESTful API를 만들어 볼 수 있습니다. 이러한 추가 기능들은 FastAPI의 강력한 기능들을 활용하여 쉽게 구현할 수 있습니다.

참고: FastAPI 공식 문서에서 더 많은 예제와 정보를 찾아볼 수 있습니다.
FastAPI 공식 문서