본문 바로가기
Python/Python Web Framework

FastAPI 05. 반환 모델과 유사한 모델들 생성하기

by mintropy 2023. 1. 18.

반환 모델 작성하기

FastAPI는 기본적으로 사용하는 모델을 추정하여 입출력값을 나타내지만 자동적으로 표현해 주는 기능에만 의존할 수는 없다. 예를 들어 게시판의 글의 목록과 각각의 글을 불러오는 API가 있을 때, 다음과 같이 설계할 수 있다.

  • 게시판 글 목록 : 글 번호, 글 제목, 조회 수, 댓글 수, 작성일
  • 게시판 글 : 글 제목, 글 내용, 조회수, 댓글 수, 댓글 목록, 작성일
    이러한 경우 각 API에 맞도록 반환모델을 기록하는것이 개발에 도움이 될 수 있다. FastAPI에서 반환 모델을 명시하는 방법은 크게 2가지이다. 첫 번째는 Python함수 반환값을 나타내듯이 ->를 사용하여 반환 타입을 입력하는 방법이고, 다른 방식은 response_model값을 지정하는 방식이다.
@app.post("/items/")
async def create_item(item: Item) -> Item:
    return item

@app.get("/items/", response\_model=list\[Item\])  
async def read\_item():  
    return \[  
        Item(name="Foo", price=52),  
        Item(name="Baa", price=93),  
    \]

두 방식을 모두 활용할 수도 있고, 이전에 다루었던 API 반환 값 예시도 같이 활용할 수 있다.

유사한 모델 그룹 생성하기

위의 게시판 예시를 더 확장해서 생각해보자. 다음과 같은 게시판 글 목록이나, 게시글 내용뿐만 아니라, 게시글 수정이나 특정 게시글 조회 등의 경우에 다른 반환값 형태를 가진다고 했을 때, 모든 모델 형태를 입력하는 것은 번거롭다. 또 다른 예시는 회원가입, 로그인 등을 생각해 볼 수 있다. 대표적으로 비밀번호의 입력은 받더라도, 데이터베이스에는 암호화된 형태만 사용한다거나, 비밀번호는 절대 반환하지 않는 것 등이 있다.

class UserBase(BaseModel):
    username: str
    email: EmailStr

class UserInput(UserBase):
    password: str

class UserOutput(UserBase):
    pass

이러한 문제는 Pydantic을 활용하여 해결할 수 있다. 각 모델을 정의한 클래스 상속을 사용하여 나타내는 방식이다. 이 부분은 Pydantic을 더 다루어볼 기회가 있다면 공유하겠다.

댓글