파이썬

Pydantic ConfigDict: 모델 동작 커스터마이징 가이드

코샵 2025. 3. 21. 10:56
반응형

Pydantic은 Python의 타입 주석을 사용하여 데이터 검증과 설정 관리를 제공하는 라이브러리입니다. ConfigDict는 Pydantic 모델의 동작을 세부적으로 제어할 수 있게 해주는 중요한 요소입니다. 이를 통해 모델 검증, 직렬화, 필드 처리 등의 다양한 측면을 커스터마이징할 수 있습니다.

ConfigDict의 기본 개념

ConfigDict는 Pydantic 모델의 설정 옵션을 정의하는 사전 형태의 구성입니다. 이를 통해 모델이 어떻게 작동할지 세밀하게 제어할 수 있습니다.

Pydantic v1에서는 내부 Config 클래스를 사용했지만, v2에서는 model_config 클래스 변수를 통해 설정하는 방식으로 변경되었습니다.

Pydantic v1 vs v2의 ConfigDict 사용법

v1 방식 (내부 Config 클래스)

from pydantic import BaseModel

class UserModel(BaseModel):
    name: str
    email: str

    class Config:
        allow_population_by_field_name = True
        validate_assignment = True

v2 방식 (model_config)

from pydantic import BaseModel, ConfigDict

class UserModel(BaseModel):
    name: str
    email: str

    model_config = ConfigDict(
        populate_by_name=True,
        validate_assignment=True
    )

ConfigDict의 주요 설정 옵션

Pydantic의 ConfigDict에는 다양한 설정 옵션이 있습니다. 가장 많이 사용되는 옵션들을 살펴보겠습니다:

1. 직렬화 관련 옵션

model_config = ConfigDict(
    # v1: alias_generator = camel_case_to_snake
    alias_generator=lambda field_name: field_name.lower(),

    # v1: allow_population_by_field_name = True  
    populate_by_name=True,

    # v1: schema_extra = {"examples": [...]}
    json_schema_extra={"examples": [{"name": "John", "email": "john@example.com"}]}
)

2. 검증 관련 옵션

model_config = ConfigDict(
    # 할당 시 검증 활성화
    validate_assignment=True,

    # v1: extra = 'forbid'
    extra='forbid',  # 'allow', 'ignore', 'forbid' 중 선택

    # v1: 없었음
    strict=True,  # 더 엄격한 타입 검사 적용

    # v1: 없었음
    frozen=True  # 모델 인스턴스를 불변으로 만듦
)

3. 필드 처리 옵션

model_config = ConfigDict(
    # v1: orm_mode = True
    from_attributes=True,  # ORM 객체에서 데이터 추출 허용

    # v1: arbitrary_types_allowed = True
    arbitrary_types_allowed=True,  # 사용자 정의 타입 허용

    # v1: underscore_attrs_are_private = True
    protected_namespaces=()  # 기본값은 ('model_', )
)

Pydantic v1에서 v2로의 주요 변경 사항

Pydantic v2는 성능과 타입 안전성을 크게 개선하기 위해 많은 부분이 재설계되었습니다. ConfigDict와 관련된 주요 변경 사항은 다음과 같습니다:

1. 네이밍 변경

v1 설정 v2 설정
allow_population_by_field_name populate_by_name
orm_mode from_attributes
schema_extra json_schema_extra
validate_all 제거됨
error_msg_templates json_schema_serialization_defaults

2. 새로운 기능 추가

v2에서는 다음과 같은 새로운 설정이 추가되었습니다:

  • strict: 더 엄격한 타입 강제 변환
  • frozen: 불변(immutable) 모델 생성
  • serialization: 직렬화 제어를 위한 새로운 옵션
  • validation: 검증 제어를 위한 새로운 옵션

3. 성능 개선

Pydantic v2는 핵심 검증 로직이 Rust로 재작성되어 성능이 크게 향상되었습니다. 이에 따라 일부 설정의 내부 구현이 변경되었습니다.

실제 활용 예시

1. API 요청/응답 모델링

from pydantic import BaseModel, ConfigDict, Field

class APIResponse(BaseModel):
    status: str
    data: dict
    message: str | None = None

    model_config = ConfigDict(
        # JSON 응답과 필드 이름 일치시키기
        populate_by_name=True,
        # 추가 필드 허용 (유연한 API 응답)
        extra='allow',
        # 스키마 예시 추가
        json_schema_extra={
            "example": {
                "status": "success",
                "data": {"user_id": 123},
                "message": "User retrieved successfully"
            }
        }
    )

2. ORM 통합 모델

from pydantic import BaseModel, ConfigDict
from datetime import datetime

class UserModel(BaseModel):
    id: int
    username: str
    created_at: datetime

    model_config = ConfigDict(
        # 속성에서 데이터 로드 허용 (ORM 통합)
        from_attributes=True,
        # 스네이크 케이스 변환
        alias_generator=lambda s: ''.join('_' + c.lower() if c.isupper() else c for c in s).lstrip('_'),
        populate_by_name=True
    )

3. 불변 설정 모델

from pydantic import BaseModel, ConfigDict

class AppSettings(BaseModel):
    api_key: str
    debug_mode: bool = False
    max_connections: int = 100

    model_config = ConfigDict(
        # 설정이 변경되지 않도록 보호
        frozen=True,
        # 필드 값 변경 시 검증
        validate_assignment=True,
        # 추가 필드 금지
        extra='forbid'
    )

결론

Pydantic의 ConfigDict는 모델의 동작을 정밀하게 제어할 수 있는 강력한 도구입니다. v1에서 v2로의 변경사항은 주로 성능 개선과 더 명확한 네이밍 규칙에 초점을 맞추고 있습니다.

v2로 마이그레이션할 때는 변경된 설정 이름과 새로운 기능을 숙지하는 것이 중요합니다. 그러나 기본적인 개념은 유지되므로, 적응하는 데 큰 어려움은 없을 것입니다.

모델 검증, 직렬화, ORM 통합 등 다양한 시나리오에서 ConfigDict를 적절히 활용하면, 더 강력하고 유연한 데이터 모델을 구축할 수 있습니다.