
오늘은 FastAPI의 핵심 기능인 CRUD API를 완성하고, 데이터베이스 연동을 위한 SQLAlchemy를 학습했습니다!

API를 만들 때, 항상 정상적인 경우만 있는 건 아니에요. 예를 들어:
이럴 때 HTTPException을 사용하면 적절한 HTTP 상태 코드와 메시지를 반환할 수 있어요!
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.post("/hello")
def hello(body: HelloRequest):
# 빈 문자연이라면 400 Bad Request 발생
if not body.name.strip():
raise HTTPException(
status_code=400,
detail="이름을 입력해주세요."
)
return {"message": f"안녕하세요, {body.name}님!"}

기본적인 데이터 처리의 4가지 기능을 모두 구현해봅시다!

from typing import List
from pydantic import BaseModel
# 임시 DB (메모리에 저장)
items = [
{"id": 1, "name": "Apple", "price": 100},
{"id": 2, "name": "Banana", "price": 80},
]
class ItemCreateRequest(BaseModel):
name: str
price: int
class ItemResponse(BaseModel):
id: int
name: str
price: int
@app.post("/items", response_model=ItemResponse, status_code=201)
def create_item(item_request: ItemCreateRequest):
new_id = len(items) + 1
new_item = {
"id": new_id,
"name": item_request.name,
"price": item_request.price,
}
items.append(new_item)
return new_item
포인트:
status_code=201: Create 성공시 201 Created 반환len(items) + 1: 간단한 ID 자동 증가@app.get("/items", response_model=List[ItemResponse])
def get_items():
return items
포인트:
List[ItemResponse]: 여러 개의 Item을 반환할 때는 List 타입@app.get("/items/{item_id}", response_model=ItemResponse)
def get_item(item_id: int):
for item in items:
if item["id"] == item_id:
return item
# 찾지 못하면 404 에러
raise HTTPException(status_code=404, detail="Item not found")
포인트:
item_id 받기
from typing import Optional
class ItemUpdateRequest(BaseModel):
name: Optional[str] = None
price: Optional[int] = None
@app.patch("/items/{item_id}", response_model=ItemResponse)
def update_item(item_id: int, item_request: ItemUpdateRequest):
for item in items:
if item["id"] == item_id:
# None이 아닌 값만 업데이트
if item_request.name is not None:
item["name"] = item_request.name
if item_request.price is not None:
item["price"] = item_request.price
return item
raise HTTPException(status_code=404, detail="Item not found")
PUT vs PATCH:

from fastapi import status
@app.delete("/items/{item_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_item(item_id: int):
for item in items:
if item["id"] == item_id:
items.remove(item)
return # 204는 body가 없으므로 return만
raise HTTPException(status_code=404, detail="Item not found")
포인트:
지금까지는 items = [] 같은 리스트에 데이터를 저장했어요. 하지만 이 방식은:

→ 데이터베이스(DB)를 사용해야 합니다!

ORM (Object-Relational Mapping)은 Python 객체와 DB 테이블을 연결해주는 기술이에요.
예시:
# SQL: SELECT * FROM items
# ORM:
db.query(Item).all()
Python에서 가장 많이 사용되는 ORM 라이브러리에요!

pip install sqlalchemy

Engine은 DB와의 연결을 관리하는 객체에요.
# connection.py
from sqlalchemy import create_engine
# SQLite DB 파일 경로
DATABASE_URL = "sqlite:///./test.db"
# Engine 생성
engine = create_engine(DATABASE_URL)
포인트:
create_engine: DB 연결 설정Session은 DB와 상호작용하는 공간이에요. 조회, 삽입, 수정, 삭제를 모두 Session을 통해 수행해요.

# connection.py
from sqlalchemy.orm import sessionmaker
# Session 클래스 생성
SessionLocal = sessionmaker(
autocommit=False,
autoflush=False,
bind=engine
)
포인트:
sessionmaker: Session 생성 팩토리bind=engine: 어떤 DB와 연결할지 지정Base는 모든 ORM 모델이 상속받을 기반 클래스예요.
# orm.py
from sqlalchemy.orm import declarative_base
Base = declarative_base()
# 이제 Item 모델을 만들 때
class Item(Base):
__tablename__ = "items"
# ...
포인트:
declarative_base(): ORM 모델의 기반 제공Base를 상속받으면 SQLAlchemy가 테이블로 인식
HTTPException: API 예외 처리의 핵심
raise HTTPException(status_code=..., detail=...)CRUD API 전체 구현
PUT vs PATCH
ORM 개념
SQLAlchemy 기초
다음 시간에는:
를 학습할 거예요!
🚀 CRUD API 마스터 완료! 이제 본격적인 백엔드 개발의 기초를 다졌어요!