FastAPI는 현대적인 웹 프레임워크 중 하나로, Python으로 API를 손쉽게 만들 수 있도록 돕습니다. 비동기 처리를 지원하며 높은 성능을 자랑하는 FastAPI는 RESTful API 개발에 최적화되어 있습니다. 이 글에서는 FastAPI를 사용한 서버 개발 주제로 CRUD(Create, Read, Update, Delete) 연산 중 ‘Delete’ 작업에 대해 다루어 보겠습니다.
1. FastAPI 소개
FastAPI는 Starlette와 Pydantic을 기반으로 하며, OpenAPI와 JSON Schema를 지원하여 사용자와의 상호작용을 더욱 매끄럽게 해줍니다. Python 타입 힌트와 문서화 기능 덕분에, 개발자는 오류를 줄이고 빠르게 개발할 수 있습니다.
1.1 FastAPI 특징
- 비동기 지원
- 자동 문서화
- 높은 성능
- 유형 기반 데이터 검증
- 간단한 라우팅
2. 환경 설정
이 프로젝트에서는 FastAPI와 SQLAlchemy를 사용하여 데이터베이스와의 상호작용을 구현합니다. 아래의 과정을 통해 FastAPI 환경을 설정해보겠습니다.
2.1 FastAPI 및 필요한 패키지 설치
FastAPI와 SQLAlchemy를 설치하기 위해서는 먼저 pip를 사용합니다. 아래의 명령어를 실행하여 설치합니다.
pip install fastapi[all] sqlalchemy
2.2 프로젝트 구조 설정
아래와 같은 기본적인 디렉터리 구조를 설정합니다.
my_fastapi_app/
│
├── app/
│ ├── main.py
│ ├── models.py
│ ├── schemas.py
│ └── database.py
└── requirements.txt
3. 데이터베이스 설정
아래는 SQLAlchemy를 사용하여 SQLite 데이터베이스를 설정하는 예제입니다.
3.1 database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
3.2 모델 정의하기
데이터베이스와 상호작용하기 위한 모델을 정의합니다.
3.2.1 models.py
from sqlalchemy import Column, Integer, String
from .database import Base
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
description = Column(String, index=True)
price = Column(Integer)
is_active = Column(Boolean, default=True)
4. 데이터 조작
이제 삭제 작업을 포함한 CRUD 연산을 구현할 수 있도록 API 엔드포인트를 생성하겠습니다.
4.1 스키마 정의하기
API 요청과 응답을 정의하기 위해 Pydantic을 사용하여 스키마를 만듭니다.
4.1.1 schemas.py
from pydantic import BaseModel
class ItemBase(BaseModel):
name: str
description: str
price: int
class ItemCreate(ItemBase):
pass
class Item(ItemBase):
id: int
is_active: bool
class Config:
orm_mode = True
4.2 CRUD 연산 구현
이제 FastAPI와 SQLAlchemy를 통합하여 CRUD 연산을 구현하겠습니다.
4.2.1 main.py
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from . import models, schemas
from .database import SessionLocal, engine
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
# Dependency
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.delete("/items/{item_id}", response_model=schemas.Item)
def delete_item(item_id: int, db: Session = Depends(get_db)):
item = db.query(models.Item).filter(models.Item.id == item_id).first()
if not item:
raise HTTPException(status_code=404, detail="Item not found")
db.delete(item)
db.commit()
return item
5. 설명 및 사용
위의 코드에서 /items/{item_id} 경로로 DELETE 요청을 보내면 해당 ID를 가진 아이템이 데이터베이스에서 삭제됩니다. 만약 아이템이 존재하지 않으면 404 Not Found 오류가 발생합니다.
5.1 사용 예시
Postman과 같은 API 클라이언트를 사용하여 요청을 테스트할 수 있습니다. 예를 들어, 다음과 같은 DELETE 요청을 보낼 수 있습니다:
DELETE http://127.0.0.1:8000/items/1
5.2 결과 확인하기
DELETE 요청이 성공적으로 처리되면, 해당 아이템의 데이터가 삭제되며, 삭제된 아이템의 정보가 응답으로 반환됩니다.
6. 결론
이 글에서는 FastAPI를 사용하여 Delete 연산을 구현하는 방법을 배웠습니다. FastAPI는 Python으로 API를 개발할 때 매우 유용한 도구이며, 데이터베이스와의 상호작용을 통해 유연한 서비스를 제공할 수 있습니다. CRUD 연산의 기본적인 사용법을 익혔다면, 실제 비즈니스 로직을 구현하는 데 더 나아갈 수 있을 것입니다.