FastAPI 이벤트 CRUD 예제
# routes/events.py
from typing import List
from fastapi import APIRouter, Body, HTTPException, Path, status
from models.events import Event, UpdateEvent
event_router = APIRouter(tags=["Event"])
events = []
# 이벤트 전체 조회 /events/
@event_router.get("/", response_model=List[Event])
async def retrive_all_events() -> List[Event]:
return events
# 이벤트 상세 조회 /events/{event_id}
@event_router.get("/{event_id}", response_model=Event)
async def retrive_event(event_id: int) -> Event:
for event in events:
if event.id == event_id:
return event
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="일치하는 이벤트를 찾을 수 없습니다."
)
# 이벤트 등록 /events/
@event_router.post("/")
async def create_event(data: Event = Body(...)) -> dict:
for event in events:
if event.id == data.id:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="동일한 이벤트가 존재합니다."
)
events.append(data)
return {"message": "이벤트 등록이 완료되었습니다."}
# 이벤트 하나 삭제 /events/{event_id}
@event_router.delete("/{event_id}")
async def delete_event(event_id: int) -> dict:
for event in events:
if event.id == event_id:
events.remove(event)
return {"message": "이벤트 삭제가 완료되었습니다."}
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="일치하는 이벤트를 찾을 수 없습니다."
)
# 이벤트 전체 삭제 /events/
@event_router.delete("/")
async def delete_all_events() -> dict:
events.clear()
return {"message": "이벤트 전체 삭제가 완료되었습니다."}
# 이벤트 수정 /events/{event_id}
@event_router.put("/{event_id}", response_model=Event)
async def update_event(event_id: int = Path(...), data: UpdateEvent) -> dict:
for event in events:
if event.id == event_id:
event.title = data.title
event.image = data.image
event.description = data.description
event.tags = data.tags
event.location = data.location
return {"message": "이벤트 수정이 완료되었습니다."}
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="일치하는 이벤트를 찾을 수 없습니다."
)
# models/events.py
from typing import List, Optional
from pydantic import BaseModel
class Event(BaseModel):
id: int
title: str
image: str
description: str
tags: List[str]
location: str
class UpdateEvent(BaseModel):
title: Optional[str] = None
image: Optional[str] = None
description: Optional[str] = None
tags: Optional[List[str]] = None
location: Optional[str] = None
이벤트 수정 포인트 정리
- FastAPI 함수 정의 시 매개변수 순서 주의
Path(...)
는 URL 경로에서 값을 추출하는 데 사용되며, 요청 시 반드시 포함되어야 하는 필수값으로 처리됨
Body(...)
는 요청 본문(JSON)에서 데이터를 추출하는 데 사용되며, 필수 입력값으로 간주됨
- 함수 정의 시
Body
인자는 기본값이 없는 인자이므로, Path
보다 앞쪽에 선언해야 오류 없음
- 수정 함수의 올바른 선언 순서 예시:
async def update_event(data: UpdateEvent, event_id: int = Path(...))
Optional[str]
또는 Optional[List[str]]
은 해당 필드가 선택 입력 가능하며, 생략되면 None으로 처리됨
- 전달되지 않은 값(None)으로 전체 필드가 덮어씌워지는 문제 → None 여부를 확인한 후 개별 할당 필요