-
FastAPI 시리즈 7화 - Response 모델과 응답 커스터마이징언어 및 프레임워크/FastAPI 2025. 5. 7. 00:48728x90
FastAPI에서 response_model, status_code, headers, media_type 등 응답(Response) 커스터마이징 방법을 예제 중심으로 정리합니다. 실전 API 응답 설계에 최적화된 내용입니다.
왜 응답 커스터마이징이 중요한가?
FastAPI는 기본적으로 JSON 응답을 반환하지만, 실전 서비스에서는 다양한 응답 포맷, 상태 코드, 헤더 구성이 필요합니다.
예를 들어:
- 응답 데이터 필터링 (민감 정보 제거)
- HTTP 상태 코드 명시
- 사용자 정의 헤더 추가
- JSON 이외의 MIME 타입 사용
이러한 케이스를 FastAPI는 간단한 선언형 문법으로 처리할 수 있습니다.
1. response_model로 응답 필터링
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class UserIn(BaseModel): name: str email: str password: str class UserOut(BaseModel): name: str email: str @app.post("/users", response_model=UserOut) def create_user(user: UserIn): return user
- UserIn: 요청 모델
- UserOut: 응답 모델
- response_model=UserOut 설정 시, 반환 데이터에서 password 필드는 자동 제거
✅ 장점
- 민감 정보 보호
- 명확한 API 응답 스펙 제시
- Swagger UI에 자동 반영
2. 상태 코드 지정 – status_code
from fastapi import status @app.post("/users", response_model=UserOut, status_code=status.HTTP_201_CREATED) def create_user(user: UserIn): return user
- status_code=201로 HTTP 201 Created 명시
- 클라이언트는 단순 200 OK보다 명확한 의미를 해석 가능
▶ status 코드 예시
상태상수의미
200 status.HTTP_200_OK 기본 응답 201 status.HTTP_201_CREATED 리소스 생성 204 status.HTTP_204_NO_CONTENT 본문 없는 성공 응답 400 status.HTTP_400_BAD_REQUEST 잘못된 요청 404 status.HTTP_404_NOT_FOUND 리소스 없음
3. 헤더 커스터마이징 – Response 객체 사용
from fastapi import Response @app.get("/custom-header") def get_custom_header(response: Response): response.headers["X-Service-Version"] = "1.2.3" return {"message": "Header set"}
- 응답 헤더에 X-Service-Version 추가
- 로그 추적, API 버전 식별 등에 활용 가능
4. MIME 타입 설정 – media_type
from fastapi.responses import HTMLResponse @app.get("/html", response_class=HTMLResponse) def get_html(): return "<h1>Hello, FastAPI</h1>"
- 기본 JSON이 아닌 HTML로 응답
- 문서 보기, 메일 템플릿, 결과 미리보기 등 다양한 용도에 활용 가능
▶ 주요 Response 클래스
클래스MIME 타입용도
JSONResponse application/json 기본 응답 HTMLResponse text/html HTML 텍스트 PlainTextResponse text/plain 일반 텍스트 FileResponse 파일 다운로드 StreamingResponse 대용량 스트리밍 데이터 응답
5. 응답 지연 처리 (보너스)
import time @app.get("/delay") def delayed_response(): time.sleep(2) return {"message": "Delayed 2 seconds"}
- 비동기 함수로 처리하면 지연 중에도 다른 요청 처리 가능
import asyncio @app.get("/async-delay") async def async_delayed_response(): await asyncio.sleep(2) return {"message": "Asynchronous delay complete"}
정리 – FastAPI의 응답 처리, 핵심은 선언적 설계
기능구현 방식
응답 필터링 response_model=모델 상태 코드 지정 status_code=status.HTTP_XXX 헤더 설정 Response 객체 활용 MIME 타입 변경 response_class=XXXResponse 비동기 지연 async def + await FastAPI는 이런 설정이 코드 안에서 직관적으로 관리되고,
Swagger UI에 모두 반영되어 개발과 문서화 사이의 간극을 줄여줍니다.
다음 글 예고
FastAPI 시리즈 8화 - 의존성 주입 시스템(Depends) 실전 활용법
에서는 FastAPI의 또 다른 강력한 기능인 Depends를 활용한
보안 인증, 공통 로직 재사용, DB 연결 관리 등 실무 활용 패턴을 다룹니다.
728x90'언어 및 프레임워크 > FastAPI' 카테고리의 다른 글
FastAPI 시리즈 9화 - Background Tasks: 비동기 작업을 우아하게 처리하는 방법 (0) 2025.05.12 FastAPI 시리즈 8화 - 의존성 주입 시스템(Depends) 실전 활용법 (0) 2025.05.09 FastAPI 시리즈 6화 - Path, Query, Header, Cookie 파라미터 제대로 다루기 (0) 2025.05.05 FastAPI 시리즈 5화 - Swagger UI와 ReDoc: 자동 문서화의 힘 (1) 2025.05.04 FastAPI 시리즈 4화 - 요청(Request)과 응답(Response) 데이터 핸들링: Pydantic 모델 이해하기 (0) 2025.05.03