Pydantic Field : 데이터 유효성 검사

2025. 2. 6. 10:17·파이썬
반응형

Pydantic의 Field는 모델 필드를 정의할 때 사용되는 핵심 기능입니다. Field를 통해 데이터 유효성 검사, 기본값 설정, 제약 조건 등을 세밀하게 제어할 수 있습니다.

기본 Field 매개변수

from pydantic import BaseModel, Field
from typing import Optional

class User(BaseModel):
    # 기본적인 Field 사용
    name: str = Field(
        default="John Doe",           # 기본값 설정
        min_length=2,                 # 최소 길이
        max_length=50,                # 최대 길이
        description="사용자의 이름"    # 필드 설명
    )

    age: int = Field(
        gt=0,                        # 0보다 큰 값
        lt=150,                      # 150보다 작은 값
        description="사용자의 나이"
    )

제약 조건 매개변수

class Product(BaseModel):
    # 숫자 관련 제약조건
    price: float = Field(
        ge=0.0,          # greater than or equal (>=)
        le=1000000.0,    # less than or equal (<=)
    )

    # 문자열 패턴 매칭
    code: str = Field(
        regex="^[A-Z]{2}[0-9]{4}$"  # 정규표현식 패턴
    )

    # 리스트 길이 제한
    tags: list[str] = Field(
        min_items=1,     # 최소 아이템 수
        max_items=5      # 최대 아이템 수
    )

고급 Field 매개변수

from datetime import datetime
from typing import Any

class AdvancedModel(BaseModel):
    # 동적 기본값
    created_at: datetime = Field(
        default_factory=datetime.now,  # 함수를 통한 기본값 생성
    )

    # 상수값 정의
    status: str = Field(
        const=True,                    # 값 변경 불가
        default="ACTIVE"
    )

    # JSON 스키마 커스터마이징
    metadata: dict[str, Any] = Field(
        title="메타데이터",
        examples=[{"key": "value"}],    # 예시 데이터
    )

의존성 있는 Field 검증

from pydantic import validator

class Order(BaseModel):
    quantity: int = Field(gt=0)
    unit_price: float = Field(gt=0)
    total_price: float = Field()

    @validator("total_price")
    def calculate_total_price(cls, v, values):
        quantity = values.get("quantity")
        unit_price = values.get("unit_price")
        if quantity and unit_price:
            return quantity * unit_price
        return v

복잡한 검증 규칙

from typing import Union
from pydantic import EmailStr

class ComplexModel(BaseModel):
    # 여러 타입 허용
    identifier: Union[int, str] = Field(
        union_mode="smart",  # 타입 추론 모드
    )

    # 이메일 검증
    email: EmailStr = Field(
        description="유효한 이메일 주소"
    )

    # 중첩된 제약조건
    score: float = Field(
        ge=0.0,
        le=100.0,
        multiple_of=0.5,  # 0.5의 배수만 허용
    )

에러 메시지 커스터마이징

class CustomErrorModel(BaseModel):
    username: str = Field(
        min_length=3,
        max_length=20,
        regex="^[a-zA-Z0-9_]*$",
        error_messages={
            "min_length": "사용자명은 최소 3자 이상이어야 합니다",
            "max_length": "사용자명은 최대 20자를 초과할 수 없습니다",
            "regex": "사용자명은 영문자, 숫자, 언더스코어만 포함할 수 있습니다"
        }
    )

JSON 스키마 커스터마이징

class SchemaModel(BaseModel):
    data: dict = Field(
        title="데이터",
        description="JSON 형식의 데이터",
        examples=[
            {"id": 1, "name": "example"},
            {"id": 2, "name": "test"}
        ],
        schema_extra={
            "examples": [
                {
                    "id": 1,
                    "name": "example"
                }
            ]
        }
    )

실전 활용 예시

from typing import Optional
from datetime import date

class Employee(BaseModel):
    id: int = Field(gt=0, description="직원 고유 ID")
    name: str = Field(
        min_length=2,
        max_length=50,
        regex="^[가-힣a-zA-Z ]*$",
        description="직원 이름"
    )
    email: EmailStr = Field(description="회사 이메일")
    department: str = Field(
        default="General",
        description="소속 부서"
    )
    hire_date: date = Field(
        default_factory=date.today,
        description="입사일"
    )
    salary: float = Field(
        gt=0,
        multiple_of=100,
        description="연봉"
    )
    is_active: bool = Field(
        default=True,
        description="재직 여부"
    )
    skills: list[str] = Field(
        default_factory=list,
        min_items=1,
        max_items=10,
        description="보유 기술"
    )

    class Config:
        schema_extra = {
            "example": {
                "id": 1,
                "name": "홍길동",
                "email": "hong@company.com",
                "department": "개발팀",
                "hire_date": "2024-01-01",
                "salary": 50000000,
                "is_active": True,
                "skills": ["Python", "FastAPI", "SQL"]
            }
        }

Field의 다양한 매개변수를 활용하면 데이터 모델을 더욱 견고하게 정의할 수 있으며, API 문서화도 자동으로 생성됩니다. 특히 FastAPI와 함께 사용할 때 그 진가를 발휘하며, 런타임에서의 데이터 유효성 검사를 통해 애플리케이션의 안정성을 크게 향상시킬 수 있습니다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬' 카테고리의 다른 글

Pydantic ConfigDict: 모델 동작 커스터마이징 가이드  (0) 2025.03.21
KoNLPy: 한국어 자연어 처리 라이브러리  (1) 2025.02.28
[Web API] URL 파라미터 데이터 전송  (1) 2025.01.23
파이썬 개발을 위한 VSCode 셋팅 가이드  (3) 2025.01.03
데이터 클래스 비교: dataclass vs Pydantic BaseModel  (0) 2024.12.08
'파이썬' 카테고리의 다른 글
  • Pydantic ConfigDict: 모델 동작 커스터마이징 가이드
  • KoNLPy: 한국어 자연어 처리 라이브러리
  • [Web API] URL 파라미터 데이터 전송
  • 파이썬 개발을 위한 VSCode 셋팅 가이드
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (730)
      • 스마트팜 (1)
      • 상품 추천 (223)
      • DataBase (0)
        • MongoDB (4)
        • PostgreSQL (0)
      • 하드웨어 (19)
      • 일기장 (4)
      • 파이썬 (131)
        • Basic (42)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (5)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    스마트스토어리뷰
    devlife
    cv2
    list
    상품 리뷰 크롤링
    라떼우유
    unity
    appdevelopment
    카페24리뷰이관
    쇼핑몰리뷰
    스크립트 실행 순서
    programming101
    ipcamera
    유니티
    Python
    learntocode
    스크립트 실행
    카페24리뷰
    믈레코비타멸균우유
    codingtips
    programmerlife
    codingcommunity
    리뷰이관
    긴유통기한우유
    rtsp
    셀레니움
    C#
    리뷰관리
    리스트
    파이썬
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
Pydantic Field : 데이터 유효성 검사
상단으로

티스토리툴바