from typing import Annotated, Any from bson import ObjectId from pydantic import BaseModel, BeforeValidator def validate_object_id(v: Any) -> str: """ObjectId <-> str 변환을 위한 유효성 검증기""" if isinstance(v, ObjectId): return str(v) if isinstance(v, str) and ObjectId.is_valid(v): return v raise ValueError(f"Invalid ObjectId: {v}") PyObjectId = Annotated[str, BeforeValidator(validate_object_id)] class ErrorResponse(BaseModel): """표준 에러 응답""" detail: str class PaginatedResponse(BaseModel): """페이지네이션 응답 래퍼""" items: list[Any] total: int page: int limit: int total_pages: int