데이터 클래스 비교: dataclass vs Pydantic BaseModel

2024. 12. 8. 10:35·파이썬
반응형

소개

Python에서 데이터를 구조화할 때 주로 사용되는 두 가지 방식인 dataclass와 Pydantic의 BaseModel에 대해 알아보겠습니다. 각각의 특징과 사용법, 그리고 언제 어떤 것을 사용해야 하는지 살펴보겠습니다.

Dataclass

기본 사용법

from dataclasses import dataclass
from typing import List, Optional

@dataclass
class User:
    name: str
    age: int
    email: Optional[str] = None
    friends: List[str] = None

# 사용 예시
user = User(name="John", age=30)
print(user.name)  # "John"

고급 기능 활용

from dataclasses import dataclass, field

@dataclass(frozen=True)  # 불변 객체 생성
class Configuration:
    host: str
    port: int = 8000
    tags: List[str] = field(default_factory=list)  # 가변 기본값

    def get_address(self) -> str:
        return f"{self.host}:{self.port}"
장점 단점
표준 라이브러리 포함 데이터 검증 기능 없음
가벼움과 빠른 성능 복잡한 타입 변환 어려움
간단한 구현 JSON 직렬화 제한적
메모리 효율적 동적 필드 처리 어려움

Pydantic : BaseModel 

기본 사용법

from pydantic import BaseModel, EmailStr
from typing import List, Optional

class User(BaseModel):
    name: str
    age: int
    email: Optional[EmailStr] = None
    friends: List[str] = []

# 사용 예시
user = User(name="John", age=30, email="john@example.com")
print(user.model_dump())  # JSON 형태로 변환

고급 기능 활용

from pydantic import BaseModel, Field, validator
from datetime import datetime

class Article(BaseModel):
    title: str = Field(..., min_length=3)
    content: str
    created_at: datetime = Field(default_factory=datetime.now)
    tags: List[str] = []

    @validator('title')
    def title_must_be_title_case(cls, v):
        if not v[0].isupper():
            raise ValueError('Title must start with capital letter')
        return v
장점 단점
강력한 데이터 검증 추가 의존성 필요
JSON 자동 직렬화/역직렬화 상대적으로 느린 성능
자동 문서화 지원 더 많은 메모리 사용
복잡한 타입 변환 지원 학습 곡선 존재

활용 예시

dataclass

from dataclasses import dataclass
from typing import Dict

@dataclass
class CacheConfig:
    max_size: int
    ttl_seconds: int
    strategy: str = "LRU"

    def validate(self) -> bool:
        return (
            self.max_size > 0 and 
            self.ttl_seconds > 0 and
            self.strategy in ["LRU", "FIFO"]
        )

# 설정 관리에 적합
config = CacheConfig(max_size=1000, ttl_seconds=3600)

baseModel

from pydantic import BaseModel, HttpUrl, constr
from datetime import datetime

class BlogPost(BaseModel):
    id: int
    title: constr(min_length=5, max_length=100)
    content: str
    author_email: EmailStr
    published: bool = False
    tags: List[str] = []
    image_url: Optional[HttpUrl] = None
    created_at: datetime

    class Config:
        json_encoders = {
            datetime: lambda v: v.isoformat()
        }

# API 요청/응답 처리에 적합
post = BlogPost(
    id=1,
    title="My First Post",
    content="Hello World",
    author_email="author@example.com",
    created_at=datetime.now()
)

선택 가이드

dataclass 사용이 좋은 경우

  1. 단순한 데이터 구조화가 필요할 때
  2. 성능이 중요한 경우
  3. 추가 의존성을 피하고 싶을 때
  4. 내부 데이터 구조에서 사용할 때
@dataclass
class Point:
    x: float
    y: float

    def distance_from_origin(self) -> float:
        return (self.x ** 2 + self.y ** 2) ** 0.5

BaseModel 사용이 좋은 경우

  1. API 요청/응답 처리
  2. 데이터 검증이 필요한 경우
  3. JSON 처리가 많은 경우
  4. FastAPI와 함께 사용할 때
class UserRegistration(BaseModel):
    username: str = Field(..., min_length=3, max_length=20)
    password: str = Field(..., min_length=8)
    email: EmailStr
    age: int = Field(..., ge=0, lt=150)

    @validator('password')
    def password_must_contain_special_char(cls, v):
        if not any(c in '!@#$%^&*()' for c in v):
            raise ValueError('Password must contain special character')
        return v

두 기능의 조합 사용

from dataclasses import dataclass
from pydantic import BaseModel, validator

# 내부 로직용 데이터 클래스
@dataclass
class UserInternal:
    id: int
    name: str
    score: float = 0.0

    def calculate_ranking(self) -> int:
        # 내부 비즈니스 로직
        pass

# API 응답용 Pydantic 모델
class UserResponse(BaseModel):
    id: int
    name: str
    score: float
    ranking: int

    @classmethod
    def from_internal(cls, user: UserInternal):
        return cls(
            id=user.id,
            name=user.name,
            score=user.score,
            ranking=user.calculate_ranking()
        )

결론

  • dataclass는 단순하고 가벼운 데이터 구조화에 적합
  • Pydantic BaseModel은 데이터 검증과 API 통신에 적합
  • 프로젝트의 요구사항에 따라 적절히 선택하거나 조합하여 사용
저작자표시 비영리 변경금지 (새창열림)

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

[Web API] URL 파라미터 데이터 전송  (1) 2025.01.23
파이썬 개발을 위한 VSCode 셋팅 가이드  (3) 2025.01.03
[Python 프로파일링] py-spy와 yappi로 파이썬 코드 성능 분석하기  (2) 2024.12.02
SQLAlchemy: 데이터베이스 툴킷  (5) 2024.11.13
ChatGPT API의 function_call  (2) 2024.02.11
'파이썬' 카테고리의 다른 글
  • [Web API] URL 파라미터 데이터 전송
  • 파이썬 개발을 위한 VSCode 셋팅 가이드
  • [Python 프로파일링] py-spy와 yappi로 파이썬 코드 성능 분석하기
  • SQLAlchemy: 데이터베이스 툴킷
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • 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 (4)
      • 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)
  • 인기 글

  • 태그

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

  • hELLO· Designed By정상우.v4.10.3
코샵
데이터 클래스 비교: dataclass vs Pydantic BaseModel
상단으로

티스토리툴바