PHpullh
학습 라이브러리/Python/Pydantic 모델 검증

PYTHON · 디자인패턴

Pydantic 모델 검증

Pydantic은 Python 타입 힌트를 활용해 런타임 데이터 검증을 자동화합니다. API 요청/응답, 설정 파일, 외부 데이터 파싱에서 타입 안전성을 보장하며, FastAPI의 핵심 기반 라이브러리입니다.

디자인패턴중급pydanticvalidationdata-modelfastapitype-safety

핵심 설명

Pydantic은 Python 타입 힌트를 활용해 런타임 데이터 검증을 자동화합니다. API 요청/응답, 설정 파일, 외부 데이터 파싱에서 타입 안전성을 보장하며, FastAPI의 핵심 기반 라이브러리입니다.

Python code

from pydantic import BaseModel, Field, field_validator, model_validator
from pydantic import EmailStr  # pip install pydantic[email]
from datetime import datetime
from typing import Optional

# 1. 기본 모델 정의
class Address(BaseModel):
    street: str
    city: str
    zip_code: str = Field(pattern=r"^\d{5}$")

class User(BaseModel):
    name: str = Field(min_length=2, max_length=50)
    email: str  # EmailStr로 변경 가능
    age: int = Field(ge=0, le=150)
    address: Optional[Address] = None
    tags: list[str] = []
    created_at: datetime = Field(default_factory=datetime.now)

    # 필드 레벨 검증
    @field_validator('name')
    @classmethod
    def name_must_not_be_empty(cls, v):
        if not v.strip():
            raise ValueError('이름은 공백만으로 구성할 수 없습니다')
        return v.strip()

    # 모델 레벨 검증
    @model_validator(mode='after')
    def check_consistency(self):
        if self.age < 14 and self.tags and 'admin' in self.tags:
            raise ValueError('14세 미만은 관리자가 될 수 없습니다')
        return self

# 2. 유효한 데이터
user = User(
    name="홍길동",
    email="hong@example.com",
    age=25,
    address={"street": "세종대로 1", "city": "서울", "zip_code": "04524"},
    tags=["developer"],
)
print(f"사용자: {user.name}, {user.age}세")
print(f"주소: {user.address.city} {user.address.street}")
print(f"JSON: {user.model_dump_json(indent=2)}")

# 3. 유효하지 않은 데이터 → 자동 에러
from pydantic import ValidationError
try:
    bad_user = User(name="", email="invalid", age=-5)
except ValidationError as e:
    print(f"\n검증 에러 {e.error_count()}개:")
    for err in e.errors():
        print(f"  {err['loc']}: {err['msg']}")

학습 팁

Pydantic v2는 Rust 기반 코어로 v1 대비 5~50배 빠릅니다. model_dump()model_validate()를 사용하고, v1의 .dict().parse_obj()는 deprecated입니다.

주의할 점

Pydantic은 기본적으로 타입을 강제 변환(coerce)합니다. "123"int 필드에 자동으로 123이 됩니다. 엄격한 검증이 필요하면 model_config = ConfigDict(strict=True)를 설정하세요.

자주 묻는 질문

Pydantic 모델 검증란 무엇인가요?

Pydantic은 Python 타입 힌트를 활용해 런타임 데이터 검증을 자동화합니다. API 요청/응답, 설정 파일, 외부 데이터 파싱에서 타입 안전성을 보장하며, FastAPI의 핵심 기반 라이브러리입니다.

Pydantic 모델 검증 학습 시 주의할 점은 무엇인가요?

Pydantic은 기본적으로 타입을 강제 변환(coerce)합니다. "123" 이 int 필드에 자동으로 123 이 됩니다. 엄격한 검증이 필요하면 model_config = ConfigDict(strict=True) 를 설정하세요.