Pydantic과 dataclasses는 각각의 장단점이 있으며, 특정 용도와 요구사항에 따라 더 적합한 선택이 달라질 수 있습니다. 다음은 두 접근 방식의 비교입니다.
경량화:
표준 라이브러리에서 제공되므로 추가 종속성이 필요 없습니다.
가벼운 클래스 정의와 데이터 저장용으로 적합합니다.
간결성:
간단한 데이터 모델을 생성할 때 문법이 간결하고 직관적입니다.
성능:
비교적 빠르며, 성능에 민감한 경우 유리할 수 있습니다.
유연성:
유효성 검사 없이, 단순히 데이터를 저장할 구조가 필요할 때 적합합니다.
유효성 검사 제한:
데이터 유효성 검사나 타입 강제에 대한 기본적인 지원이 없습니다. 추가적인 유효성 검사가 필요하다면 직접 구현해야 합니다.
데이터 직렬화/역직렬화:
JSON이나 다른 포맷으로의 직렬화/역직렬화 기능이 기본적으로 제공되지 않으며, 추가 코드가 필요합니다.
유효성 검사:
필드 타입 검증 및 조건을 쉽게 설정할 수 있습니다. 입력 데이터의 유효성 검사와 변환이 자동으로 처리됩니다.
데이터 직렬화/역직렬화:
JSON 등 다양한 포맷의 데이터를 쉽게 직렬화 및 역직렬화할 수 있습니다.
타입 강제:
필드에 대한 타입 강제 및 데이터 변환 기능을 자동으로 처리합니다. 예를 들어, 문자열을 정수로 변환하거나, 잘못된 데이터 타입을 처리할 수 있습니다.
데코레이터와 유틸리티:
다양한 추가 기능과 데코레이터를 제공하여, 필드의 기본값 설정, 필드의 별칭 설정, 조건부 필드 등의 사용이 가능합니다.
추가 종속성:
pydantic 패키지를 설치해야 합니다. 이는 프로젝트의 종속성을 증가시킬 수 있습니다.
성능:
데이터 검증과 타입 강제 기능 때문에 dataclass에 비해 성능이 떨어질 수 있습니다. 성능이 매우 중요한 애플리케이션에서는 주의해야 합니다.
복잡성:
더 많은 기능을 제공하기 때문에 문법이 다소 복잡할 수 있으며, 작은 프로젝트에는 과도할 수 있습니다.
| 특징 | dataclass | Pydantic |
|---|---|---|
| 불변성 | 객체를 불변으로 만듭니다 | 제공하지 않습니다 |
| 유효성 검사 | 제공하지 않습니다 | 강력한 유효성 검사 기능 |
| 타입 강제 | 제공하지 않습니다 | 자동 타입 강제 및 변환 |
| 데이터 직렬화/역직렬화 | 기본적으로 제공하지 않습니다 | 강력한 직렬화/역직렬화 기능 |
| 성능 | 상대적으로 빠릅니다 | 상대적으로 느릴 수 있습니다 (rust로 작성되어 충분히 빠릅니다) |
| 추가 종속성 | 없습니다 | pydantic 라이브러리 필요 |
from dataclasses import dataclass, asdict
@dataclass
class Product():
id: int
name: str
price: float
if __name__ == '__main__':
# 객체 생성
product = Product(id=123, name="goods", price=1234.5)
# 딕셔너리로 직렬화( asdict라는 추가 코드가 필요하다 )
product_dict = asdict(product)
print(product_dict)
# 객체로 역직렬화
product_from_dict = Product(**product_dict)
print(product_from_dict)
실행결과:

from pydantic import BaseModel
class Product(BaseModel):
id: int
name: str
price: float
if __name__ == '__main__':
# 객체 생성
product = Product(id=123, name="goods", price=1234.5)
# 딕셔너리로 직렬화
product_dict = product.dict()
print(product_dict)
# 객체로 역직렬화
product_from_dict = Product(**product_dict)
print(product_from_dict)
실행 결과:

타입을 강제해야한다면 pydantic을 도입을 고려해야 합니다.
굳이 강제할 필요가 없는 코드라면 @dataclass를 쓰는것 만으로 충분합니다.