FastAPI는 Pydantic 패키지와 같이 함께 사용하는 경우가 많다. 해당 패키지는 파이썬 객체 클래스인 models로 데이터 구조를 정의한다.
일반적인 정의: 변수의 값과 크기를 선언하는 것. 이를 통해 프로그래밍 과정에서 실수를 줄임.
같은 맥락에서 보자면, 타입힌트는 타입 오류 검사 이상의 기능을 수행하는 도구를 작성하고자 하는 파이썬 개발자에게 유용함.
대충 이렇게 생긴 느낌
#기본적인 생김새
name: type
# 변수를 값으로 초기화 할 수 도 있음
name:type = value
# 타입은 int나 str 같은 표준 파이썬 단순 타입이나
#컬렉션 타입 중 하나일 수 있음
thing: str ="apple"
person: dict = {"kim": "Jiwoo", "answer": "29"}
이렇게 타입 힌트를 주는 것을 Pydantic으로 주면 다음과 같은 형식일 것이다.
from typing import Any
person: dict[str, Any] = {"Kim","Jiwoo", "answer": 29}
#합집합을 표현하자면?
from typing import Union
person: dict[str, Union[Str, int]] = {"Kim","Jiwoo", "answer": 29}
# 파이썬 3.10이상에서는 이렇게
person: dict[str, str | int] = {"Kim","Jiwoo", "answer": 29}
함수에서 반환값을 알려주는 타입힌트는 다음처럼 보여줄 수 있다.
function(args) -> type:
#example
def get_thing() -> str:
return "yeti"
사실 개발을 진행하면서 개별 변수를 각각 전달하는 것은 쉽고 간단하지만 개발 규모가 커지면 커질 수 록 귀찮아지는 지점이 분명 존재한다. 그렇다면 여러 변수들을 그룹으로 통합하고 타입힌트를 유지할 필요성도 있다는 것을 확인할 수 있다.
그런데 기본적인 타입이나 컬렉션 타입을 조합하는 방법이나 표준클래스를 만들어서 관리하는 것은 너무나도 귀찮고 번거롭다. 파이썬에서는 dataclass를 이용하여 조금 덜 번거롭게 작업할 수 있는 방법이 있다.
from dataclasses import dataclass
@dataclass
class PersonDataClass():
name:str
country: str
age: int
dataclass_person = PersonDataClass(
"Jiwoo",
"KR",
"100"
)
하지만 이것 만으로는 데이터 타입과 관련된 문제를 잡아내지 못할 가능성이 크다. 이 경우 특히 FastAPI와 함께 사용하는 경우 Pydantic을 사용하는 것이 유용한다. attr이나 Dataclass와는 스타일의 차이가 다소 존재하는데, Pydantic은 상속에 의존하는 편이고 나머지는 데코레이터를 통해 의존성검사를 실현한다.
그래서 이게 제공하는 기능은 아래와 같다.
예를 들면 아래처럼 해볼 수 있다.
# model.py
from pydantic import BaseModel
class Person(BaseModel):
name:str
country:str
age:int
human = Person(
name="Jiwoo",
country="KR",
age=100
)
이런식으로 사용