Python/FastAPI / / 2022. 12. 24. 10:54

FastAPI 알아보기 - Pydantic과 직렬화

So What is Pydantic?

FastAPI를 쓰시는 분들이라면 무조건 쓰게될 Pydantic(파이단틱), 바로 데이터 직렬화와, 역직렬화에 필요한 데이터 검증 도구이다. 공식 문서에서도 Data validation과 settings management으로 소개하고 있다. 그렇다면 데이터 직렬화(Serialization)과 역직렬화(Deserialization)에 대해서 궁금하신 분들이 있을 것이다. 이에대해 설명하고 넘어가겠다.

 

Data Serialization 

https://hazelcast.com/glossary/serialization/

직렬화란 데이터를 전송하거나, 저장할 수 있게 특정한 포맷으로 데이터를 변화시키는 것이다. 즉, 파일 시스템이나, 데이터베이스 혹은 네트워크를 통해 전송할 수 있게 일련된 바이트로 변경시키는 것이다. 이 과정의 반대가 바로 역직렬화(Deserialization)이다. 이런 포맷에는 여러 형태가 있는데 대표적으로 JSON, XML, CSV 등등이 있다.

 

이러한 직렬화가 필요한 이유에는 여러가지가 있겠지만, 가장 큰 이유는 "저장이나 전송 가능한 데이터"는 값만 가능하기 때문이다. 예를들어, 우리가 파이썬 클래스를 만들었다고 하자, 이 클래스를 전송하려면 우리는 클래스가 저장된 메모리 주소를 보내야 된다고 생각할 것이다. 하지만 이러한 메모리 주소는 컴퓨터마다 다 다르다. 즉, 이 메모리 주소가 유효하지가 않다. 

 

So How to use Pydantic?

FastAPI의 기본 파싱 라이브러리인 Pydantic에 대해 어떻게 사용하는지 알아보겠다. 공식문서에도 잘 설명되어 있어서 공식문서를 참조해서 이야기해보겠다.

#over python 3.10

from datetime import datetime
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: datetime | None = None
    friends: list[int] = []


external_data = {
    'id': '123',
    'signup_ts': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}
user = User(**external_data)

Pydantic의 경우 런타임에서 타입 힌트를 강제하고, 이를 통해서 잘못된 데이터에 대해서는 유저친화적인 에러를 내뿜는 다고 한다. 위의 코드를 한번 잘 살펴보겠다.

  • id - integer타입으로 annotation되어있다. 여기서 annotation만 되어있는 변수의 경우 pydantic에서는 무조건적으로 필요한 필드라는 것을 뜻한다. 즉 데이터를 검증할 때 이 부분에 상응하는 키 값이 있거나 integer값이 있어야 한다. 만약 없거나, integer값이 아니면 에러를 내뿜는다.
  • name - 기본적으로 제공되는 값인 "John Doe"가 있기 때문에 이 필드는 요구되지 않는다.
  • singup_ts - datetime타입으로 선언되었지만, None으로도 대체가 가능하다는 것을 보여준다. 즉 이 필드에 값이 없어도 상관이 없다는 뜻이다. 만약 값이 없을 경우에는 기본적으로 None이 들어간다.
  • friends - 리스트 타입으로 integer로 된 리스트를 받는다. 

만약 위의 id값이 없다면 어떤 에러를 뿜을까? 아래의 데이터를 넣으면 다음과 같은 오류가 나온다.

 

from pydantic import ValidationError

try:
    User(signup_ts='broken', friends=[1, 2, 'not number'])
except ValidationError as e:
    print(e.json())
[
  {
    "loc": [
      "id"
    ],
    "msg": "field required",
    "type": "value_error.missing"
  },
  {
    "loc": [
      "signup_ts"
    ],
    "msg": "invalid datetime format",
    "type": "value_error.datetime"
  },
  {
    "loc": [
      "friends",
      2
    ],
    "msg": "value is not a valid integer",
    "type": "type_error.integer"
  }
]

위의 예시처럼, 아주 자세하게 어느 필드가 어떤 이유로 에러가 났는지를 알려준다.

 

이처럼 이번 글에서는 Pydantic에 대해서 간단하게 알아보았다. 다음 글에서는 이 Pydantic을 이용해서 어떻게 데이터 검증을 FastAPI에서 하는지 실질적인 코드를 짜보려고 한다. 

 

 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유