PYTHON · 디자인패턴
Pydantic 모델 검증
Pydantic은 Python 타입 힌트를 활용해 런타임 데이터 검증을 자동화합니다. API 요청/응답, 설정 파일, 외부 데이터 파싱에서 타입 안전성을 보장하며, FastAPI의 핵심 기반 라이브러리입니다.
핵심 설명
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) 를 설정하세요.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.