데이터 클래스 비교: 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: 데이터베이스 툴킷
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (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)
  • 인기 글

  • 태그

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

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

티스토리툴바