FastAPI(response_model)
2025. 4. 2. 20:49ㆍ고급 웹프로그래밍
response_model VS Type Hint
FastAPI에서 응답을 정의하는 방법에는 두 가지 주요 방식이 있다.
- 데코레이터에서
response_model
을 사용 (ex.@app.get("/tags/{id}", response_model=TagOut)
)- FastAPI에게 "이 구조로 응답해!"라고 알려줌
- 반환 타입을 Type Hint로 지정 (ex.
def get_tag(id: int) -> TagOut:
)- 개발자끼리 "이 함수는 이런 걸 리턴할 거야"라고 표시
1. 차이점
비교 항목 | response_model (데코레이터 사용) |
반환 타입 힌트( -> Model ) |
---|---|---|
역할 | 응답 데이터 필터링 및 변환 | 개발자가 의도한 반환타입 지정 |
필드 자동 필터링 | 가능(secret 같은 필드 숨김) |
불가능 |
데이터 변환 | FastAPI 내부적으로 처리 | 직접 변환해야 함 |
OpenAPI 문서 자동화 | 가능(/docs API 스펙 반영) |
불완전함 |
보안 필드 숨김 | 가능 | 불가능 |
추가적인 응답 타입 지정 | 가능 | 타입 힌트에 리스트 사용하면 불가능 |
2. 필드 자동 필터링 예시
models.py
class Tag(BaseModel):
id: int
tag: str
created_at: datetime
secret: str
class TagOut(BaseModel):
id: int
tag: str
created_at: datetime
main.py
@app.get("/tags/{id}", response_model=TagOut)
def get_tag(id: int):
return Tag(id=1, tag="python", secret="1234")
위와 같은 경우 secret
은 자동으로 응답에서 제거됨
3. 데이터 변환
타입 힌트
@app.get("/tags/{id}")
def get_tag(id: int) -> TagOut:
tag = Tag(id=1, tag="fastapi", created_at=datetime.now(), secret="1234")
tag_out = TagOut(
id=tag.id,
tag=tag.tag,
created_at=tag.created_at
)
return tag_out
response_model
@app.get("/tags/{id}")
def get_tag(id: int) -> TagOut:
tag = Tag(id=1, tag="fastapi", created_at=datetime.now(), secret="1234")
return tag
# 위와 같이 쓰면 FastAPI는 내부적으로 아래처럼 알아서 변환 해줌
return TagOut(**tag.dict())
response_model 예시
@app.get("/tags/{id}", response_model=TagOut)
def get_tag(id: int):
tag = services.get_tag(id)
return tag
response_model 과 type hint를 같이 써도 되나요?
- 가능
@app.get("/tags/{id}", response_model=TagOut)
def get_tag(id: int) -> Tag:
tag = services.get_tag(id)
return tag
response_model은 문서와 보안을 중시하고 타입 힌트는 코드 가독성 및 개발자 협업을 중시
질문
1. 보안 필드는 어떻게 정해지는가?
- 응답용 모델에서 정의한 데이터를 제외하고 다 보안 필드라고 해석한다
2. 입력용 모델인지 입력 모델인지 아니면 내부에서 사용하는 모델인지는 어떡해 구별하는가?
- @에 response_model의 인자 -> 응답용 모델
- def 에 함수 인자 -> 입력 모델
- return에 반환값으로 사용 -> 내부 모델
반응형
'고급 웹프로그래밍' 카테고리의 다른 글
FastAPI(동기와 비동기) (0) | 2025.04.09 |
---|---|
운영체제와 파이썬 기본 개념 (0) | 2025.04.03 |
FastAPI(models) (0) | 2025.04.02 |
FastAPI(Header) (0) | 2025.04.02 |
FastAPI(Body) (2) | 2025.03.27 |