FastAPI 서버개발, Docker Compose를 이용한 다중 서비스 배포

서론

애플리케이션 개발에 있어서는 단일 서비스로 모든 요구 사항을 충족하는 것이 점점 더 어려워지고 있습니다. 또한, 다양한 기술 스택이 공존하고 있으며, 이는 이를 운영할 수 있는 복잡성을 증가시킵니다. 이러한 환경에서 FastAPIDocker Compose를 활용하여 간단하고 효과적으로 다중 서비스를 배포하는 방법을 알아보겠습니다.

FastAPI란?

FastAPI는 Python으로 작성된 현대적인 웹 프레임워크로, 빠르고 쉽게 RESTful API를 구축할 수 있게 도와줍니다. FastAPI는 다음과 같은 주요 기능을 가지고 있습니다:

  • 자동 생성되는 API 문서: Swagger UI와 ReDoc을 사용하여 간편하게 API 문서를 생성합니다.
  • 높은 성능: asyncio 기반으로 설계되어 비동기 요청을 처리할 수 있습니다.
  • 유효성 검사: Pydantic 모델을 활용하여 데이터 유효성 검사를 자동으로 수행합니다.

Docker Compose란?

Docker Compose는 여러 Docker 컨테이너를 정의하고 실행할 수 있는 도구입니다. 이를 사용하면 여러 서비스가 서로 어떻게 연결되는지를 정의할 수 있는 docker-compose.yml 파일을 작성하게 됩니다. 이러한 기능은 마이크로서비스 아키텍처를 구현하는 데 유용합니다.

프로젝트 구조 설정

FastAPI와 Docker를 사용한 예제를 위해, 다음과 같은 폴더 구조를 설정하겠습니다:

    my_fastapi_project/
    ├── app/
    │   ├── main.py
    │   └── requirements.txt
    ├── docker-compose.yml
    ├── .env
    └── Dockerfile
    

1. FastAPI 애플리케이션 구현

먼저 app/main.py 파일에 FastAPI 애플리케이션을 구현하겠습니다.

from fastapi import FastAPI

app = FastAPI()

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

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

이 코드는 기본적인 FastAPI 애플리케이션을 구현하고 있으며, 두 개의 경로를 제공합니다:

  • /: “Hello, World” 메시지를 반환합니다.
  • /items/{item_id}: 지정된 아이템 ID와 쿼리 매개변수를 반환합니다.

2. 의존성 설정

FastAPI를 실행하기 위해 필요한 패키지들을 requirements.txt 파일에 정의합니다.

fastapi
uvicorn[standard]

3. Dockerfile 작성

Dockerfile을 통해 FastAPI 애플리케이션을 Docker 이미지로 설정합니다. Dockerfile을 생성하고 다음 내용을 추가하세요:

FROM python:3.9

WORKDIR /app

COPY ./app /app

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

EXPOSE 8000

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

위의 Dockerfile은 다음 단계를 수행합니다:

  1. python:3.9 이미지를 사용합니다.
  2. 작업 디렉토리를 설정합니다.
  3. 애플리케이션 코드를 컨테이너에 복사합니다.
  4. 의존성을 설치합니다.
  5. 8000 포트를 열고, Uvicorn 서버를 실행합니다.

4. Docker Compose 파일 작성

이제 Docker Compose 파일을 작성합니다. docker-compose.yml을 생성하고 다음 내용을 추가하세요:

version: '3.8'

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

이 Docker Compose 파일은 FastAPI 서비스를 설정하고, 외부에서 8000 포트로 접근할 수 있도록 합니다.

5. 환경 변수 관리

추가적으로 .env 파일을 생성하여 환경 변수를 관리할 수 있습니다. 다음과 같이 작성합니다:

FASTAPI_ENV=production

6. Docker Compose 실행

모든 설정이 완료되었다면 Docker Compose를 실행하여 FastAPI 애플리케이션을 시작할 수 있습니다. 다음 명령어를 사용합니다:

docker-compose up --build

브라우저에서 http://localhost:8000에 접근하여 FastAPI 애플리케이션이 정상적으로 실행되는지 확인합니다. Swagger UI로 접속하려면 http://localhost:8000/docs를 입력하면 됩니다.

7. 결론

FastAPI와 Docker Compose를 사용하면 다중 서비스를 간편하게 배포할 수 있다는 점을 살펴보았습니다. 이제 여러분은 FastAPI와 Docker를 기반으로 한 강력한 개발 환경을 구축하고, 다양한 마이크로서비스 아키텍처를 구현할 준비가 되었습니다. 이러한 도구들을 활용하여 더 복잡한 시스템을 설계하고 배포해봅시다.

8. 다음 단계

다음 단계로는 FastAPI의 다양한 기능을 이용해 더 복잡한 API를 구성하고, OAuth2와 같은 인증 방식을 도입하는 방법에 대해 학습할 수 있습니다. 또한, PostgreSQL과 같은 데이터베이스와의 연동도 이어질 주요 주제입니다.

참고자료