blog

Pydantic 2.x 모델 필드: 유효성 검사 + 전처리 + 후처리

날짜: 2025-06-07

목록으로


✅ 사용할 수 있는 주요 Pydantic v2 Validator / Hook 종류

데코레이터 용도 실행 시점
@field_validator 개별 필드 단위 유효성 검사 / 후처리 입력 후 유효성 검사 시
@model_validator(mode="before") 전체 모델 단위 전처리 모델 생성 직전
@model_validator(mode="after") 전체 모델 단위 후처리 모델 생성 후
@field_serializer 직렬화 커스터마이징 (응답용) 출력 시 (dict/json)
@computed_field 계산 필드 (저장 안됨) 응답 시 계산

1. @field_validator

필드 단위 유효성 검사 및 값 가공 (예: 반올림, 길이 체크 등)

from pydantic import field_validator

class User(SQLModel):
    score: float

    @field_validator("score")
    def round_score(cls, v):
        return round(v, 2)

2. @model_validator

@model_validator(mode="before")

모델 생성 전에 입력 데이터 전체를 검사하거나 가공

from pydantic import model_validator

class User(SQLModel):
    name: str
    email: str

    @model_validator(mode="before")
    @classmethod
    def merge_name_email(cls, data):
        data["name"] = data["name"].strip().title()
        data["email"] = data["email"].lower()
        return data

@model_validator(mode="after")

모델 인스턴스 생성 , 종속 필드 간 논리 검사

@model_validator(mode="after")
def validate_name_email(self):
    if self.name in self.email:
        raise ValueError("이름이 이메일에 포함되어 있으면 안 됩니다")
    return self

3. @field_serializer

응답용 가공이 필요할 때 사용 (예: 날짜 형식 변경 등)

from pydantic import field_serializer
from datetime import datetime

class User(SQLModel):
    created_at: datetime

    @field_serializer("created_at")
    def serialize_created_at(self, dt: datetime, _info):
        return dt.strftime("%Y-%m-%d %H:%M")

4. @computed_field

응답 시 계산용 필드 (DB 저장 안 됨, property 대체용)

from pydantic import computed_field

class User(SQLModel):
    name: str
    email: str

    @computed_field
    @property
    def domain(self) -> str:
        return self.email.split("@")[1]

📌 참고 정리

모델 직렬화 / 역직렬화

user = User(name="길동")

# 직렬화
user.model_dump()               # dict 출력
user.model_dump_json()          # JSON 문자열

# 역직렬화
User.model_validate(data)       # dict → 모델
User.model_validate_json(json)  # JSON → 모델

🧾 요약 표: Pydantic v2 기준 주요 기능

항목 사용법 / 예시
기본 필드 정의 name: str
Optional 필드 desc: str | None = None
중첩 모델 address: Address
Field 옵션 Field(..., min_length=3)
유효성 검사 @field_validator / @model_validator
모델 설정 model_config = { "extra": "forbid", ... }
Enum .value 사용 model_config = {"use_enum_values": True}
직렬화 .model_dump(), .model_dump_json()

목록으로