TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 웹개발>

[파이썬] Pydantic: 데이터 검증 라이브러리

by 기록자_Recordian 2024. 8. 17.
728x90
반응형
Pydantic
이해하기 쉬운 Pydantic: 데이터 유효성 검사와 데이터 모델링의 새로운 기준

 

Pydantic은 Python에서 가장 널리 사용되는 데이터 검증 라이브러리이다.


Pydantic은 Python의 데이터 유효성 검사와 데이터 모델링을 더욱 간편하고 직관적으로 만들어주는 라이브러리이다. FastAPI와 같은 최신 웹 프레임워크에서 자주 사용되며, 데이터의 정확성과 일관성을 보장하기 위해 널리 활용된다.


Pydantic 이름의 유래

 

"Pydantic"이라는 이름은 "Py"와 "pedantic"의 합성어이다. "Py" 부분은 라이브러리가 Python과 연관되어 있음을 나타내고, "pedantic"은 라이브러리의 데이터 검증 및 유형 적용에 대한 세심한 접근 방식을 나타낸다.

"Pydantic"은 이러한 요소를 결합하여 세부 사항 중심적이고 엄격한 데이터 검증을 제공하는 Python 라이브러리를 설명한다.


Pydantic이란 무엇인가?


Pydantic은 Python 데이터 클래스에 타입 힌팅(type hinting)을 기반으로 한 데이터 유효성 검사와 데이터 직렬화/역직렬화를 제공하는 라이브러리이다. Pydantic을 사용하면, 데이터를 구조화하는 모델을 쉽게 정의할 수 있으며, 정의된 모델에 따라 입력된 데이터의 타입과 값을 자동으로 검사할 수 있다.


Pydantic의 핵심 기능

 

  • 데이터 유효성 검사: 모델에 정의된 타입에 따라 입력 데이터를 검증한다.
  • 데이터 직렬화/역직렬화: JSON과 같은 형식으로 데이터를 손쉽게 변환할 수 있다.
  • 타입 힌팅 지원: Python의 강력한 타입 힌팅과 잘 통합되어 명확하고 읽기 쉬운 코드를 작성할 수 있다.

[데이터 검증, 데이터 직렬화]

  • 데이터 검증(data validation): 사용자나 다른 시스템이 보내는 데이터가 올바른 형식과 값인지 확인하는 과정. 데이터 검증을 통해 잘못된 정보를 사전에 차단할 수 있다. (예. 금액 입력 시 문자열 입력 방지)
  • 데이터 직렬화(data serialization): 복잡한 데이터 구조를 바이트나 문자열로 변환해서 다른 시스템과 쉽게 데이터를 교환할 수 있는 형태로 만드는 것. ↔ 역직렬화: 문자열이나 바이트를 원래의 데이터 구조로 되돌리는 것

[데이터 검증, 데이터 직렬화가 필요한 이유]

  • 데이터 검증: 잘못된 데이터가 처리되는 것을 막아서 버그나 다양한 문제 예방
  • 데이터 직렬화: 서로 다른 시스템끼리 데이터를 쉽게 주고 받을 수 있게 해준다

▶ 데이터 요청을 위해 자주 사용하는 HTTP POST 메서드는 데이터를 요청 바디에 넣어서 전송하므로, POST 메서드로 API를 선언하는 경우에는 Pydantic 모델 사용을 고려할 필요가 있다.


Pydantic을 사용하는 이유
출처: Pydantic 공식 사이트
  • 유형 힌트로 구동 — Pydantic을 사용하면 스키마 검증 및 직렬화가 유형 주석으로 제어된다. 학습할 내용도 적고, 작성할 코드도 적으며, IDE 및 정적 분석 도구와 통합된다.
  • 속도 - Pydantic의 핵심 검증 로직은 Rust로 작성되었다. 그 결과, Pydantic은 Python을 위한 가장 빠른 데이터 검증 라이브러리 중 하나이다.
  • JSON 스키마 — Pydantic 모델은 JSON 스키마를 방출할 수 있어 다른 도구와 쉽게 통합할 수 있다.
  • Strict 및 Lax 모드 — Pydantic은 두 strict=True모드(데이터가 변환되지 않는 모드) 또는 strict=FalsePydantic이 적절한 경우 데이터를 올바른 유형으로 강제 변환하려는 모드에서 실행할 수 있다.
  • Dataclasses , TypedDicts 등 — Pydantic은 dataclass및 를 포함한 많은 표준 라이브러리 유형의 검증을 지원한다. 
  • 사용자 정의 — Pydantic은 사용자 정의 검증기와 직렬화기를 통해 여러 가지 강력한 방식으로 데이터가 처리되는 방식을 변경할 수 있도록 한다.
  • 생태계 - PyPI의 약 8,000개 패키지가 Pydantic을 사용하며, FastAPI , huggingface , Django Ninja , SQLModel , & LangChain 과 같은 인기 있는 라이브러리도 포함된다.
  • 전투 테스트 - Pydantic은 한 달에 7,000만 번 이상 다운로드 되고 모든 FAANG 기업과 NASDAQ에서 가장 큰 25개 기업 중 20개 기업에서 사용되고 있다.

Pydantic의 기본 사용법

 

Pydantic의 기본 사용법은 매우 간단하다. BaseModel 클래스를 상속받아 모델을 정의하고, 해당 모델에 필드와 타입을 지정하면 된다.

from pydantic import BaseModel
from typing import Optional

class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None

위 코드에서는 Item이라는 모델을 정의하였고, name은 문자열, price는 실수, is_offer는 선택적인 bool 값이다.

이 모델을 사용하여 데이터 객체를 생성하면, 자동으로 데이터 유효성 검사가 수행된다.

item = Item(name="Bread", price=3.5, is_offer=True)
print(item)

 

만약 잘못된 타입의 데이터를 입력하면 Pydantic은 에러를 발생시킨다.

item = Item(name="Bread", price="three point five")
# TypeError: value is not a valid float

Pydantic의 변수 타입 (Feat. FastAPI)

 

name: str 형태는 Pydantic 모델에서 변수 타입을 명시하는 방법이다.

여기서 name은 변수 이름이고, str은 변수 타입이며, 사용가능한 키워드는 아래와 같다.

 

  • int: 정수
  • float: 실수
  • bool: 불리언(True or False)
  • str: 문자열
  • datatime.datetime: 날짜와 시간
  • Optional: typing 모듈의 일부로, 필드가 선택적임을 나타낸다 (None 값도 허용된다는 것을 의미)

이 밖에도 Pydantic과 FastAPI는 다양한 커스텀 타입을 지원한다.

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

app = FastAPI()

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: float = 0.1

@app.post("/items/")
async def create_item(item: Item):
	return {"item": item.dict()}

# 실행: uvicorn main:app --reload

위의 FastAPI 코드는 Item 이라는 Pydantic 모델을 사용하여 입력 데이터를 예상되는 형식에 맞게 자동으로 변환하고 유효성 검사를 수행한다. Item 모델에는 다음 필드가 포함된다.

  • name: 문자열, 필수
  • description: 문자열, 선택적이며 기본값은 None
  • price: 부동소수점 숫자, 필수
  • tax: 부동소수점 숫자, 선택적이며 기본값은 0.1

◆ curl 테스트

curl 명령으로 POST 요청을 보내면, 요청 바디에 포함된 JSON 데이터는 Item 모델의 인스턴스로 변환된다.

Pydantic은 제공된 필드의 타입을 확인하고 price 같은 필수 필드가 포함되어 있는지, 그리고 tax 같은 선택적 필드가 없을 경우 기본값을 사용하는지 검증한다. 그리고 유효성 검사를 통과한 데이터로 Item 객체를 생성하고, 이를 .dict() 메서드를 통해 딕셔너리로 변환하여 응답으로 반환한다.

curl -X POST "http://127.0.0.1:8000/items/" -H "accept:appliaction/json" -H "Content-Type:application/json" -d "{\"name\": \"Soap\", \"price\": 2.5}"


Pydantic의 장점과 단점

 

[장점]

  • 사용의 용이성: Pythonic한 코드 스타일로 쉽게 사용할 수 있다.
  • 강력한 데이터 유효성 검사: 자동으로 데이터 타입과 값의 유효성을 검사한다.
  • FastAPI와의 완벽한 통합: FastAPI와 같은 최신 웹 프레임워크에서 널리 사용된다.

[단점]

  • 퍼포먼스: 매우 대규모의 데이터셋을 처리할 때는 성능이 저하될 수 있다.
  • 고급 기능의 학습 곡선: 고급 기능을 완전히 활용하려면 추가적인 학습이 필요하다.
 

[파이썬] FastAPI - Pydantic (2)

시작에 앞서해당 내용은 , Dave Lee 지음. BJ Public 출판.내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.이전 내용 [파이썬] FastAPI - HTTP 메서드, Pydantic시작에

puppy-foot-it.tistory.com

 


[출처: 가장 빠른 풀스택을 위한 플라스크 & FastAPI, Pydantic 웹페이지]

728x90
반응형