json을 기반으로 한 데이터 카드 모델과 enum.Enum을 활용한 데이터 타입 모델을 함께 구성하면 다음과 같이 만들 수 있습니다. 이 구조는 예: 문학관 콘텐츠 시스템(PoemTree)에서 시, 수필, 댓글, 메타정보 등을 저장할 때 사용할 수 있습니다.


✅ 1. Enum 기반 데이터 카드 타입 모델

from enum import Enum

class DataCardType(Enum):
    CONTENT = "content"           # 시, 수필 등 주요 콘텐츠
    META = "meta"                 # 작성자, 날짜, 길이 등 메타정보
    COMMENT = "comment"           # 댓글 정보
    RATING = "rating"             # 평점 정보
    HISTORY = "history"           # 수정 내역
    TAG = "tag"                   # 태그 목록
    CONFIG = "config"             # 설정 정보
    INTERACTION = "interaction"   # 사용자 반응 (좋아요, 즐겨찾기 등)
    STAT = "stat"                 # 통계 정보 (조회수, 댓글 수 등)
    MULTIMEDIA = "multimedia"     # 이미지, 오디오, 영상 등 첨부 자료
    USER = "user"                 # 사용자 정보 카드

✅ 2. JSON 기반 데이터 카드 기본 구조

Python 객체로 JSON 직렬화가 가능한 구조이며, dataclasses와 함께 사용하면 깔끔하게 표현할 수 있습니다.

from dataclasses import dataclass, field, asdict
from datetime import datetime
from typing import List, Dict, Optional, Any
import json
import uuid

@dataclass
class DataCard:
    id: str
    card_type: DataCardType
    data: Dict[str, Any]
    created_at: str = field(default_factory=lambda: datetime.utcnow().isoformat())
    updated_at: Optional[str] = None
    metadata: Dict[str, Any] = field(default_factory=dict)

    def to_json(self) -> str:
        # Enum은 value로 변환해서 JSON 직렬화
        dict_data = asdict(self)
        dict_data["card_type"] = self.card_type.value
        return json.dumps(dict_data, ensure_ascii=False, indent=2)

    @staticmethod
    def from_json(json_str: str) -> 'DataCard':
        obj = json.loads(json_str)
        return DataCard(
            id=obj["id"],
            card_type=DataCardType(obj["card_type"]),
            data=obj["data"],
            created_at=obj.get("created_at", datetime.utcnow().isoformat()),
            updated_at=obj.get("updated_at"),
            metadata=obj.get("metadata", {})
        )

✅ 3. 예제: 콘텐츠 카드 생성 및 JSON 출력

# 시 콘텐츠 카드 예시 생성
poetry_card = DataCard(
    id=str(uuid.uuid4()),
    card_type=DataCardType.CONTENT,
    data={
        "title": "그대 떠난 자리에",
        "author": "이상",
        "content": "바람이 불어오는 자리에 당신의 이름이 있었습니다."
    },
    metadata={
        "language": "ko",
        "length": 34
    }
)

# JSON 출력
print(poetry_card.to_json())

✅ 4. 활용 포인트

  • DB 저장 시에는 card_type, data, created_at 필드만 JSON 컬럼 하나로 저장해도 충분합니다.
  • 데이터 필터링 시에는 card_type을 기준으로 분류하면 됩니다.
  • 확장이 용이하며, 데이터 카드 자체를 API 응답 포맷으로도 바로 사용할 수 있습니다.

필요하다면 이 구조를 기반으로 Flask/FastAPI CRUD 연동, SQLAlchemy JSON 필드 매핑, 검색 인덱싱 전략까지도 설계해드릴 수 있습니다. 요청 주세요!

+ Recent posts