FastAPI 서버개발, docker compose를 사용하는 이유

현대 웹 개발에서는 빠르고 효율적인 애플리케이션을 구축하는 것이 점점 더 중요해지고 있습니다. FastAPI는 Python을 기반으로 하여 비동기 웹 프레임워크로서 높은 성능과 사용 편의성을 제공합니다. 그러나, 실제 애플리케이션을 배포하고 운영하기 위해서는 여러 가지 환경 설정 및 관리 작업이 필요합니다. 이러한 설정을 보다 간편하게 해주는 도구 중 하나가 바로 Docker와 Docker Compose입니다. 이번 글에서는 FastAPI 서버를 Docker Compose와 함께 사용하는 이유에 대해 자세히 설명하고, 예제 코드를 통해 이해를 돕겠습니다.

1. FastAPI란?

FastAPI는 Python 3.6 이상에서 사용할 수 있는 비동기 웹 프레임워크로, RESTful API를 구축하는 데 최적화되어 있습니다. FastAPI는 Pydantic을 기반으로 한 데이터 유효성 검사, 자동 문서화, 그리고 높은 성능(Starlette 프레임워크 기반) 등의 장점을 제공합니다. FastAPI를 사용하면 개발자는 API를 빠르게 구축하고, 배포하며 스케일링할 수 있습니다.

FastAPI의 주요 특징

  • 비동기 IO 지원: FastAPI는 비동기 프로그래밍 모델을 지원하여 높은 성능을 제공합니다.
  • 자동 문서화: Swagger UI와 ReDoc을 사용한 자동 API 문서화를 지원합니다.
  • 데이터 유효성 검사: Pydantic을 통해 데이터 모델의 유효성을 검사할 수 있습니다.
  • 유연성: 다양한 인증 및 보안 메커니즘을 쉽게 추가할 수 있습니다.

2. Docker란?

Docker는 컨테이너 기술을 기반으로 하는 오픈 소스 플랫폼으로, 애플리케이션을 신속하고 일관되게 배포할 수 있도록 도와줍니다. Docker를 사용하면 애플리케이션과 그 종속성이 포함된 이미지를 생성하고, 이를 통해 동일한 환경에서 실행할 수 있습니다. 이를 통해 “작동하는 내 머신에서 되지 않는” 문제를 해결할 수 있습니다.

Docker의 주요 특징

  • 환경 일관성: 개발, 테스트, 운영 환경에서 동일한 컨테이너를 사용할 수 있습니다.
  • 리소스 효율성: 가상 머신보다 가볍고 성능 저하가 적습니다.
  • 신속한 배포: 이미지를 사용하여 빠르게 애플리케이션을 배포할 수 있습니다.
  • 스케일링: 여러 인스턴스를 쉽게 실행하고 관리할 수 있습니다.

3. Docker Compose란?

Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 실행할 수 있는 도구입니다. 복잡한 애플리케이션 환경을 간편하게 설정하고 관리할 수 있도록 도와줍니다. Compose는 YAML 파일을 사용하여 애플리케이션의 서비스, 네트워크 및 볼륨을 구성할 수 있습니다.

Docker Compose의 사용 장점

  • 서비스 정의: 여러 서비스를 하나의 YAML 파일에 정의할 수 있습니다.
  • 일괄 실행: 단일 명령어로 모든 서비스를 시작하거나 중지할 수 있습니다.
  • 환경 변수 지원: 다양한 설정을 환경 변수로 쉽게 관리할 수 있습니다.
  • 상태 관리: 컨테이너의 상태를 자동으로 관리합니다.

4. FastAPI와 Docker Compose를 함께 사용하는 이유

FastAPI 애플리케이션을 Docker Compose로 관리하면 다음과 같은 여러 가지 이점이 있습니다:

  • 개발 환경 일관성: 팀원 간에 동일한 개발 환경을 공유할 수 있습니다.
  • 자동화: 배포 과정에서 반복적인 작업을 자동화할 수 있습니다.
  • 스케일링 용이성: 추가 서비스를 쉽게 배포하고 관리할 수 있습니다.
  • 테스트와디버깅: Docker 컨테이너 내에서의 빠른 테스트나 디버깅이 가능합니다.

5. FastAPI 애플리케이션을 Docker Compose로 설정하기

그럼 FastAPI 애플리케이션을 Docker Compose로 설정하는 방법에 대해 단계별로 알아보겠습니다.

5.1. FastAPI 애플리케이션 코드 작성

먼저, FastAPI 애플리케이션을 작성하겠습니다. `app.py`라는 파일을 생성하고 아래의 코드를 입력합니다:

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, "q": q}

5.2. Dockerfile 작성

다음으로, 비슷한 디렉토리에 `Dockerfile`을 생성하고 아래 내용을 추가합니다:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

COPY ./app /app

# 의존성 설치
RUN pip install fastapi
RUN pip install uvicorn

5.3. Docker Compose 설정

이제 `docker-compose.yml` 파일을 생성하고 아래와 같이 작성합니다:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:80"
    volumes:
      - ./app:/app
    environment:
      - MODULE_NAME=app.main

5.4. Docker Compose 명령어 실행

이제 Docker Compose를 통해 애플리케이션을 실행해봅시다. 아래의 명령어를 입력하여 Docker Compose를 실행합니다:

docker-compose up --build

이제 웹 브라우저를 열고 http://localhost:8000으로 접근하면 FastAPI가 정상적으로 동작하는 것을 확인할 수 있습니다. Swagger UI는 http://localhost:8000/docs에서 확인할 수 있습니다.

6. 결론

FastAPI는 현대 웹 API 구축에 적합한 고성능 프레임워크이며, Docker와 Docker Compose는 이러한 애플리케이션을 관리하는 데 큰 도움이 됩니다. 컨테이너화 및 서비스 관리를 통해 복잡한 환경에서도 일관성을 유지할 수 있으며, 개발 과정에서의 효율성이 크게 향상됩니다. FastAPI와 Docker Compose의 조합은 개발자에게 편리하고 강력한 도구를 제공합니다.

앞으로 FastAPI 및 Docker Compose를 적극적으로 활용하여 보다 품질 높은 애플리케이션을 개발할 수 있기를 바랍니다. 이 글이 FastAPI와 Docker Compose를 이해하는 데 도움이 되었기를 바랍니다.