데이터 중심 클래스를 간결하고 안전하게 작성합니다.
@dataclass는 타입 힌트가 있는 필드에서 __init__, __repr__, __eq__ 같은 반복 코드를 생성합니다. frozen=True는 속성 재대입을 막아 값 객체를 표현하고 field로 기본 생성 규칙을 지정합니다.
@dataclass(frozen=True)가 __init__, __repr__, __eq__를 만들어 주므로 print(python)은 Course(title='Python', level='입문', tags=('backend', 'data'))를 출력합니다. 같은 값으로 만든 두 인스턴스를 ==로 비교하면 필드를 차례로 비교해 True가 나옵니다. frozen이라 python.title에 새 값을 대입하면 FrozenInstanceError가 발생합니다.
리스트 기본값은 field(default_factory=list)를 사용해야 인스턴스마다 새 리스트가 생깁니다. __post_init__에서 여러 필드에 걸친 검증을 수행할 수 있습니다.
API 요청과 도메인 모델의 요구사항이 다르면 하나의 dataclass를 모든 계층에서 재사용하지 말고 경계별 모델을 구분합니다.
created_at=datetime.now() 같은 기본값도 정의 시 한 번 평가되므로 default_factory를 사용합니다.
직접 바꿔보세요level이 허용된 값인지 __post_init__에서 검증하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.