FastAPI(response_model)

2025. 4. 2. 20:49고급 웹프로그래밍

response_model VS Type Hint

FastAPI에서 응답을 정의하는 방법에는 두 가지 주요 방식이 있다.

  1. 데코레이터에서 response_model을 사용 (ex. @app.get("/tags/{id}", response_model=TagOut) )
    • FastAPI에게 "이 구조로 응답해!"라고 알려줌
  2. 반환 타입을 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