Serializers & DTOs: API가 노출하는 것을 제어하기
발행: (2026년 2월 26일 오전 04:48 GMT+9)
2 분 소요
원문: Dev.to
Source: Dev.to
DTO란 무엇인가?
**DTO (Data Transfer Object)**는 클라이언트에 노출되는 데이터를 정확히 정의하여 내부 필드가 유출되는 것을 방지합니다.
예시 모델
다음과 같은 필드를 가진 Item 모델을 생각해 보세요:
idnamedescriptionpricecreated_atinternal_db_id← 민감한 내부 필드deleted_at← 민감한 내부 필드
DTO가 없으면 이 모든 필드가 클라이언트에 반환됩니다.
DTO 정의
class ItemResponseDTO(BaseModel):
id: int
name: str
price: float
class Config:
from_attributes = True
이 DTO는 id, name, price만 노출합니다.
FastAPI 엔드포인트에서 DTO 사용하기
@app.get("/items", response_model=List[ItemResponseDTO])
def get_all_items():
db = SessionLocal()
items = db.query(Item).all()
db.close()
return items
FastAPI의 response_model 매개변수는 DTO를 기준으로 출력 결과를 필터링합니다.
- DTO 없이 –
/items/full요청은internal_db_id와deleted_at을 포함한 모든 모델 필드를 반환합니다. - DTO와 함께 –
/items요청은ItemResponseDTO에 정의된 필드만 반환하므로 민감한 데이터가 숨겨집니다.
API가 노출하는 내용을 항상 명시적으로 정의하세요.