FastAPI 서버개발, 도커, 로컬에 애플리케이션 배포

최근 몇 년 간 웹 애플리케이션 개발에서 Python의 인기가 급격히 증가하고 있습니다. 특히, FastAPI는 비동기식 프로그래밍을 지원하고, 높은 성능과 쉬운 작성 구조 덕분에 많은 개발자들 사이에서 각광받고 있습니다. 이번 글에서는 FastAPI를 사용하여 서버 개발을 하고, 도커(Docker)를 사용하여 애플리케이션을 배포하는 방법에 대해 자세히 알아보겠습니다.

1. FastAPI란?

FastAPI는 Python으로 작성된 현대적인 웹 프레임워크로, RESTful API를 쉽고 빠르게 개발할 수 있도록 도와줍니다. 중요한 특징 중 하나는 데이터 검증과 직렬화를 위한 Pydantic을 내장하고 있다는 점입니다. 빠른 속도와 쉬운 사용법 덕분에 많은 스타트업과 대기업에서 채택하고 있습니다.

1.1 FastAPI의 주요 특징

  • 비동기 프로그래밍 지원
  • 자동으로 API 문서화(Swagger UI 및 ReDoc 사용)
  • 데이터 검증 및 직렬화 기능 제공
  • 빠른 처리 속도(Starlette 기반)
  • 주요 데이터베이스와의 통합 지원

2. FastAPI 개발 환경 설정

FastAPI 프로젝트를 시작하기 위해 필요한 개발 환경을 설정해보겠습니다. Python 3.6 이상이 필요하며, FastAPI와 Uvicorn을 설치해야 합니다.

2.1 FastAPI 및 Uvicorn 설치

pip install fastapi uvicorn

2.2 간단한 FastAPI 서버 구현

간단한 “Hello World” API를 만들어 보겠습니다. 아래 코드를 main.py 파일에 작성합니다:


from fastapi import FastAPI

app = FastAPI()

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

이제 서버를 실행해보겠습니다. 터미널에서 아래 명령어를 입력합니다:

uvicorn main:app --reload

서버가 정상적으로 실행되면 http://127.0.0.1:8000 에 접속하여 “Hello World” 메시지를 확인할 수 있습니다.

3. FASTAPI API Endpoint 구성

이제 FastAPI의 다양한 API 엔드포인트를 추가해 보겠습니다. 사용자 정보를 관리하는 간단한 API를 설계해보겠습니다.

3.1 데이터 모델 정의

Pydantic을 사용하여 데이터 모델을 정의합니다:


from pydantic import BaseModel
from typing import List

class User(BaseModel):
    id: int
    name: str
    email: str
    

3.2 사용자 목록과 API 엔드포인트 추가

사용자 목록을 저장하고, 사용자 정보를 CRUD할 수 있는 기능을 추가합니다:


users = []

@app.post("/users/", response_model=User)
async def create_user(user: User):
    users.append(user)
    return user

@app.get("/users/", response_model=List[User])
async def read_users():
    return users

@app.get("/users/{user_id}", response_model=User)
async def read_user(user_id: int):
    user = next((user for user in users if user.id == user_id), None)
    if user is None:
        return {"error": "User not found"}
    return user
    

4. 도커(Docker) 설정

이제 FastAPI 애플리케이션을 도커를 사용하여 컨테이너화해보겠습니다. 도커는 애플리케이션을 패키징, 배포 및 실행할 수 있는 플랫폼입니다.

4.1 도커 설치

도커는 아래 링크에서 다운로드하여 설치할 수 있습니다:

4.2 도커파일 작성

애플리케이션을 컨테이너화하기 위해 도커파일을 생성합니다. 프로젝트 루트에 Dockerfile이라는 이름으로 아래 내용을 작성합니다:


# 사용하고자 하는 이미지를 지정
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 파일 복사
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 애플리케이션 코드 복사
COPY ./app /app

# 컨테이너가 시작될 때 실행할 커맨드
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
    

4.3 requirements.txt 작성

프로젝트에 필요한 패키지 목록을 작성합니다. 아래는 requirements.txt의 예시입니다:


fastapi
uvicorn
pydantic
    

4.4 도커 이미지 빌드 및 실행

이제 도커 이미지를 빌드하고 실행해 보겠습니다. 터미널에서 아래 명령어를 입력합니다:


# 도커 이미지 빌드
docker build -t fastapi-app .

# 도커 컨테이너 실행
docker run -d -p 80:80 fastapi-app
    

이제 웹 브라우저에서 http://localhost 에 접속하여 FastAPI 애플리케이션이 도커에서 잘 실행되고 있는지 확인할 수 있습니다.

5. 로컬 배포 및 테스트

FastAPI 애플리케이션을 로컬 환경에서 배포하기 위해서는 앞서 설정한 도커 컨테이너를 사용할 수 있습니다. 하지만 배포 후 테스트도 필요합니다. Postman과 같은 도구를 사용하여 API 엔드포인트를 테스트할 수 있습니다.

5.1 Postman 사용하기

Postman을 사용하여 API 요청을 보내고 응답을 확인해보겠습니다. 먼저 Postman을 설치합니다.

5.2 사용자 생성 테스트

새로운 사용자를 추가하기 위해 POST 요청을 보냅니다:

  • 메소드: POST
  • URL: http://localhost/users/
  • Body(Nuclei):
  • 
    {
        "id": 1,
        "name": "홍길동",
        "email": "hong@example.com"
    }
    

사용자 정보를 확인하기 위해 GET 요청을 보내어 생성한 사용자를 조회해봅니다.

6. 결론

이번 포스트에서는 FastAPI를 사용하여 간단한 웹 애플리케이션을 개발하고, 도커를 통해 로컬 환경에서 배포하는 과정을 알아보았습니다. FastAPI의 비동기 지원과 데이터 검증 기능 덕분에 더욱 생산적인 개발이 가능했습니다. 도커를 사용하여 애플리케이션을 컨테이너화함으로써 배포와 관리를 더욱 효율적으로 수행할 수 있습니다. 실제 적용 시에는 CI/CD 파이프라인을 추가하여 더 나은 배포 프로세스를 구축할 수 있습니다.

이 글을 통해 FastAPI와 도커의 이점을 이해하고, 실제 프로젝트에 적용해보시길 바랍니다. 감사합니다!