현대 웹 애플리케이션 개발에서 API 서버는 핵심적인 역할을 하고 있습니다. 그 중 FastAPI는 비동기 프로그래밍을 지원하며, 높은 성능과 사용자 친화적인 문서를 자동 생성하는 강력한 웹 프레임워크입니다. 본 강좌에서는 FastAPI를 이용한 서버 개발 방법과 이를 도커 이미지로 배포하는 방법에 대해 자세히 설명하겠습니다.
1. FastAPI란?
FastAPI는 Python 3.6 이상에서 사용할 수 있는 현대적인 웹 프레임워크입니다. FastAPI의 주요 특징은 다음과 같습니다:
- 비동기 지원: Python에서 비동기 프로그래밍을 쉽게 사용할 수 있도록 지원합니다.
- 자동 문서화: Swagger UI와 ReDoc을 통한 자동 API 문서화를 제공합니다.
- 타입 힌트: Python 타입 힌트를 통해 코드 작성 시 더 많은 정보를 제공합니다.
- 설정 간결성: 매우 간결하고 직관적인 API 설계를 지원합니다.
2. FastAPI 설치
FastAPI를 사용하기 위해서는 우선 Python과 FastAPI 패키지를 설치해야 합니다. 다음 명령어를 사용해 설치할 수 있습니다:
pip install fastapi uvicorn
3. 기본 FastAPI 서버 만들기
간단한 FastAPI 서버를 만들어 보겠습니다. 아래 코드는 기본적인 RESTful API의 구조를 보여줍니다.
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, query_param: str = None):
return {"item_id": item_id, "query_param": query_param}
위 코드를 작성한 후, Uvicorn을 통해 서버를 실행할 수 있습니다:
uvicorn main:app --reload
이제 브라우저에서 http://127.0.0.1:8000 으로 이동하면 “Hello World” 메시지를 확인할 수 있습니다. 또한 Swagger UI에서 API 문서를 확인할 수 있습니다.
4. FastAPI를 이용한 데이터베이스 연결
FastAPI와 데이터베이스를 연결하여 더 복잡한 애플리케이션을 구축할 수 있습니다. 예를 들어, SQLAlchemy를 사용해 데이터베이스와 연결해봅시다. 먼저 필요한 패키지를 설치합니다.
pip install sqlalchemy databases
다음으로, 간단한 데이터베이스 모델을 정의합니다:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
Base = declarative_base()
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
description = Column(String, index=True)
Base.metadata.create_all(bind=engine)
5. FastAPI와 SQLAlchemy를 통한 CRUD API 생성
이제 CRUD(Create, Read, Update, Delete) 작업을 수행하는 API를 작성해보겠습니다. 아래의 코드는 Item 모델을 사용하여 CRUD 기능을 구현합니다.
from fastapi import FastAPI, HTTPException
from sqlalchemy.orm import Session
from .database import engine, SessionLocal
from .models import Item # 위에서 정의한 모델
app = FastAPI()
# Dependency
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/items/")
async def create_item(item: Item, db: Session = next(get_db())):
db.add(item)
db.commit()
db.refresh(item)
return item
@app.get("/items/{item_id}")
async def read_item(item_id: int, db: Session = next(get_db())):
return db.query(Item).filter(Item.id == item_id).first()
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, db: Session = next(get_db())):
db_item = db.query(Item).filter(Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
db_item.name = item.name
db_item.description = item.description
db.commit()
return db_item
@app.delete("/items/{item_id}")
async def delete_item(item_id: int, db: Session = next(get_db())):
db_item = db.query(Item).filter(Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
db.delete(db_item)
db.commit()
return {"detail": "Item deleted successfully"}
6. FastAPI 애플리케이션 도커화
다 작성한 API 서버를 도커화를 통해 배포할 수 있습니다. 이를 위해서는 도커파일을 작성해야 합니다. 아래는 프로젝트 루트 디렉토리에 위치할 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", "--reload"]
위의 Dockerfile은 Python 이미지 기반으로 하며, 필요한 패키지를 설치하고 애플리케이션 코드를 복사하여 Uvicorn으로 서버를 실행합니다.
7. Docker Compose 사용하기
복잡한 애플리케이션을 위해 Docker Compose를 설정해보겠습니다. ‘docker-compose.yml’ 파일을 생성하고 아래와 같이 작성해주세요:
version: '3'
services:
app:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
environment:
- DATABASE_URL=sqlite:///./test.db
이제 다음 명령어로 도커 이미지를 빌드하고 실행할 수 있습니다:
docker-compose up --build
이를 통해 FastAPI 서버가 도커에서 실행되며, http://localhost:8000에서 접근 가능합니다.
8. 종합
FastAPI와 Docker를 이용한 웹 애플리케이션 개발은 매우 효율적이며, 높은 성능과 쉬운 배포가 장점입니다. 이번 강좌를 통해 FastAPI와 Docker 사용의 기초를 배우셨다면, 더 복잡한 애플리케이션에 도전해 보시기 바랍니다. 데이터베이스 연결, 인증 및 권한 관리, 데이터 검증 등 다양한 기능을 추가하여 더욱 강력한 API를 개발할 수 있습니다.
9. 추가 자료
FastAPI와 관련하여 자세한 문서는 공식 웹사이트(fastapi.tiangolo.com)에서 확인할 수 있으며, 커뮤니티에서 제공하는 다양한 자료와 예제를 참고해 보세요. Docker에 관한 문서는 Docker 공식 홈페이지(docs.docker.com)에서 찾아볼 수 있습니다.