FastAPI는 파이썬으로 작성된 현대적인 웹 프레임워크로, 빠른 성능과 직관적인 API 설계를 제공합니다. 이번 강좌에서는 FastAPI를 사용하여 간단한 웹 서버를 개발하고, 이를 도커로 감싸 배포하는 방법을 알아보겠습니다. 전체 과정은 크게 세 부분으로 나눌 수 있습니다:
- FastAPI 서버 개발
- FastAPI 서버의 기능 구현
- 도커파일 작성 및 컨테이너화
1. FastAPI 서버 개발
1.1 FastAPI 설치
FastAPI를 사용하기 위해서는 먼저 FastAPI와 UVicorn(ASGI 서버)을 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다:
pip install fastapi uvicorn
1.2 기본 FastAPI 서버 설정
아래의 간단한 예제는 기본적인 FastAPI 서버를 설정하는 방법을 보여줍니다:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
위 코드는 가장 기본적인 FastAPI 서버로, 루트 URL(“/”)에 GET 요청을 보내면 JSON 형식으로 {“Hello”: “World”}를 반환합니다.
1.3 서버 실행
이제 서버를 실행해 보겠습니다. 아래와 같은 명령어로 서버를 시작할 수 있습니다:
uvicorn main:app --reload
여기서 main
은 Python 파일의 이름(확장자 제외)이며, app
은 FastAPI 인스턴스의 이름입니다. --reload
플래그는 코드 변경 시 자동으로 서버를 다시 시작합니다.
2. FastAPI 서버의 기능 구현
2.1 RESTful API 설계
FastAPI는 RESTful API 설계에 매우 유용합니다. 다음 단계에서는 사용자 관리 API를 구현해 보겠습니다.
2.2 데이터 모델 정의
FastAPI에서는 Pydantic을 사용하여 데이터 유효성 검사를 수행하는 모델을 정의할 수 있습니다. 사용자 모델을 정의해 보겠습니다:
from pydantic import BaseModel
from typing import List, Optional
class User(BaseModel):
id: int
name: str
email: str
2.3 CRUD API 구현
다음으로 간단한 CRUD(Create, Read, Update, Delete) API를 만들어 보겠습니다. 사용자를 저장할 리스트를 만들고, 각 API 엔드포인트를 정의하겠습니다:
from fastapi import FastAPI, HTTPException
app = FastAPI()
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 get_users():
return users
@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int):
for user in users:
if user.id == user_id:
return user
raise HTTPException(status_code=404, detail="User not found")
@app.put("/users/{user_id}", response_model=User)
async def update_user(user_id: int, user: User):
for index, u in enumerate(users):
if u.id == user_id:
users[index] = user
return user
raise HTTPException(status_code=404, detail="User not found")
@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
for index, u in enumerate(users):
if u.id == user_id:
del users[index]
return {"message": "User deleted"}
raise HTTPException(status_code=404, detail="User not found")
위 코드는 사용자를 생성, 조회, 수정 및 삭제하는 API를 구현합니다. 각 API는 적절한 HTTP 상태 코드를 반환합니다.
3. 도커파일 작성 및 컨테이너화
3.1 도커 설치
도커를 사용하기 위해서는 먼저 도커를 설치해야 합니다. 공식 웹사이트에서 설치 방법을 참고할 수 있습니다.
3.2 도커파일 작성
도커는 애플리케이션을 컨테이너화하여 쉽게 배포할 수 있게 도와줍니다. FastAPI 애플리케이션을 위한 도커파일을 작성해 보겠습니다. 파일 이름은 Dockerfile
로 설정합니다:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./app /app
# 설정된 작업 디렉토리
WORKDIR /app
# 필요한 의존성 설치
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# 애플리케이션 실행
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
도커파일에서 FROM
지시어는 사용할 기본 이미지를 결정합니다. COPY
지시어는 코드를 컨테이너에 복사하며, RUN
지시어는 필요한 라이브러리를 설치합니다. 마지막으로 CMD
지시어는 컨테이너가 시작될 때 실행되는 명령을 지정합니다.
3.3 요구 사항 파일 작성
다음으로 FastAPI와 UVicorn을 포함하는 requirements.txt
파일을 생성합니다:
fastapi
uvicorn
3.4 도커 이미지 빌드
이제 도커 이미지를 빌드할 차례입니다. 아래 명령어를 사용하여 이미지를 빌드합니다:
docker build -t myfastapiapp .
3.5 컨테이너 실행
컨테이너를 실행하려면 먼저 도커가 실행 중인지 확인한 후 다음 명령어를 입력합니다:
docker run -d --name fastapi-container -p 80:80 myfastapiapp
이렇게 하면 FastAPI 애플리케이션이 도커 컨테이너에서 실행됩니다. 웹 브라우저에서 http://localhost
를 열면 API에 접속할 수 있습니다.
결론
이번 강좌에서는 FastAPI를 이용한 서버 개발 방법과 도커파일 작성 및 컨테이너화하는 과정을 살펴보았습니다. FastAPI는 직관적인 문법과 성능 덕분에 많은 개발자에게 사랑받고 있으며, 도커를 사용하면 쉽게 배포할 수 있습니다. 이를 통해 실제 운영 환경에서도 쉽게 사용할 수 있는 백엔드 서버를 구축할 수 있습니다.