본문 바로가기

Development/Python

python pydantic v1 과 v2 의 차이

1. 성능 향상

  • Pydantic v2는 Rust 기반의 pydantic-core를 사용하여 성능이 크게 향상됨.
  • 데이터 검증 및 변환 속도가 최대 50배 이상 빠름.

2. BaseModel 동작 방식 변경

  • v1: BaseModel의 속성에 직접 접근하면 원본 데이터 유지됨.
  • v2: 내부적으로 __pydantic_private__을 활용하여 데이터 변환이 더 명확해짐.
from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int

user = User(name="Alice", age="25")

print(user.age)  # v1: 25 (자동 변환) / v2: 25 (동일하지만 내부 구조가 변경됨)

3. 새로운 ConfigDict 방식

  • v1: Config 클래스를 사용하여 설정 정의.
  • v2: ConfigDict를 사용하여 설정을 정의.

v1 방식

class User(BaseModel):
    name: str
    age: int

    class Config:
        extra = "forbid"

v2 방식

from pydantic import ConfigDict

class User(BaseModel):
    name: str
    age: int

    model_config = ConfigDict(extra="forbid")

4. Strict 모드 추가

  • 데이터 타입을 엄격하게 검증하는 strict=True 옵션이 추가됨.
  • v1에서는 유연하게 변환되었지만, v2에서는 더 엄격한 검증을 설정할 수 있음.
from pydantic import BaseModel, Strict

class User(BaseModel):
    name: str
    age: int

    model_config = ConfigDict(strict=True)

User(name="Alice", age="25")  # ❌ v2에서는 오류 발생 (age가 int가 아님)

5. model_dump()로 데이터 직렬화

  • v1: dict()를 사용하여 변환.
  • v2: model_dump()를 사용하여 더 세밀한 옵션을 제공.
user = User(name="Alice", age=25)

# v1
print(user.dict())  # ✅ v1 방식

# v2
print(user.model_dump())  # ✅ v2 방식

6. model_construct() 추가

  • v2에서는 __init__()을 거치지 않고 인스턴스를 직접 생성할 수 있는 model_construct()가 추가됨.
  • 검증을 우회할 때 유용.
user = User.model_construct(name="Alice", age="25")  # 검증 없이 생성
 
 

7. 필드 기본값 설정 방식 변경

  • Field(default=...) 대신 default를 직접 지정할 수 있음.
from pydantic import BaseModel, Field

class User(BaseModel):
    name: str
    age: int = 20  # ✅ v2에서는 기본값 설정 가능
 

📌 정리

기능Pydantic v1Pydantic v2
성능 Python 기반 Rust 기반 (pydantic-core)
설정 Config 클래스 사용 ConfigDict 사용
데이터 변환 유연한 변환 strict=True로 엄격한 검증 가능
데이터 직렬화 dict() model_dump()
인스턴스 생성 User(name, age) model_construct() 지원

 

 

728x90
반응형