컬렉션과 필드

이 페이지

컬렉션은 콘텐츠 유형(게시물, 페이지, 제품)입니다. 필드 정의가 각 항목 데이터의 형태를 설정합니다.

컬렉션 만들기

관리 패널의 Content Types에서 컬렉션을 만듭니다. 각 컬렉션에는 다음 속성이 있습니다:

EmDash 콘텐츠 유형 - 페이지, 게시물, 사용자 정의 컬렉션과 기능 표시
속성설명
slugURL 안전 식별자 (예: posts, products)
label표시 이름 (예: “Blog Posts”)
labelSingular단수형 (예: “Post”)
description편집자를 위한 선택적 설명
icon관리 사이드바용 Lucide 아이콘 이름
supports초안, 리비전, 미리보기, 예약, 검색, SEO 등의 기능

컬렉션 기능

컬렉션을 만들 때 필요한 기능을 활성화합니다:

기능설명
drafts초안/게시 워크플로 활성화
revisions버전 스냅샷으로 콘텐츠 이력 추적
preview초안 콘텐츠에 대한 서명된 미리보기 URL 생성
scheduling미래 날짜에 콘텐츠 게시 예약

다음 컬렉션은 네 가지 기능을 모두 활성화합니다:

{
  slug: "posts",
  label: "Blog Posts",
  labelSingular: "Post",
  supports: ["drafts", "revisions", "preview", "scheduling"]
}

필드 유형

EmDash는 SQLite 컬럼 유형에 매핑되는 16가지 필드 유형을 지원합니다.

텍스트 필드

string

짧은 텍스트 입력. TEXT 컬럼에 매핑됩니다.

{ slug: "title", type: "string", label: "Title" }

text

여러 줄 텍스트 영역. TEXT 컬럼에 매핑됩니다.

{ slug: "excerpt", type: "text", label: "Excerpt" }

slug

URL 안전 slug 필드. TEXT 컬럼에 매핑됩니다.

{ slug: "handle", type: "slug", label: "URL Handle" }

리치 콘텐츠

portableText

리치 텍스트 편집기 (TipTap/ProseMirror). JSON으로 저장됩니다.

{ slug: "content", type: "portableText", label: "Content" }

Portable Text는 HTML을 삽입하지 않고 구조를 보존하는 블록 기반 형식입니다.

json

임의의 JSON 데이터. JSON으로 저장됩니다.

{ slug: "metadata", type: "json", label: "Custom Metadata" }

숫자

number

소수. REAL 컬럼에 매핑됩니다.

{ slug: "price", type: "number", label: "Price" }

integer

정수. INTEGER 컬럼에 매핑됩니다.

{ slug: "quantity", type: "integer", label: "Stock Quantity" }

불리언과 날짜

boolean

참/거짓 토글. INTEGER (0/1)에 매핑됩니다.

{ slug: "featured", type: "boolean", label: "Featured Post" }

datetime

날짜 및 시간 선택기. ISO 8601 문자열로 저장됩니다.

{ slug: "eventDate", type: "datetime", label: "Event Date" }

선택

select

목록에서 단일 옵션. TEXT 컬럼에 매핑됩니다.

{
  slug: "status",
  type: "select",
  label: "Product Status",
  validation: {
    options: ["active", "discontinued", "coming_soon"]
  }
}

multiSelect

목록에서 여러 옵션. JSON 배열로 저장됩니다.

{
  slug: "features",
  type: "multiSelect",
  label: "Product Features",
  validation: {
    options: ["wireless", "waterproof", "eco-friendly"]
  }
}

미디어와 참조

image

미디어 라이브러리에서 이미지 선택기. 미디어 ID를 TEXT로 저장합니다.

{ slug: "featuredImage", type: "image", label: "Featured Image" }

file

미디어 라이브러리에서 파일 선택기. 미디어 ID를 TEXT로 저장합니다.

{ slug: "attachment", type: "file", label: "PDF Attachment" }

reference

다른 컬렉션 항목에 대한 참조. 항목 ID를 TEXT로 저장합니다.

{
  slug: "author",
  type: "reference",
  label: "Author",
  options: {
    collection: "authors"
  }
}

필드 속성

모든 필드는 다음 속성을 지원합니다:

속성유형설명
slugstring데이터베이스의 컬럼 이름
labelstring관리 UI의 표시 라벨
typeFieldType16가지 필드 유형 중 하나
requiredboolean필드에 값이 필수인지 여부
uniqueboolean항목 간에 값이 고유해야 하는지 여부
indexedboolean이 필드로 효율적인 정렬 및 필터링 허용
defaultValueunknown새 항목의 기본값
validationobject유형별 유효성 검사 규칙
widgetstring사용자 정의 위젯 식별자
optionsobject위젯별 구성
sortOrdernumber편집기에서의 표시 순서

컬렉션 쿼리가 orderBy나 필드 필터에서 사용자 정의 필드를 사용해야 할 때 indexed: true를 설정하세요. 인덱스는 string, url, number, integer, boolean, datetime, select, reference, slug 필드에서 지원됩니다. EmDash는 인덱싱된 JSON, 리치 콘텐츠 및 기타 비스칼라 필드 유형을 거부합니다.

유효성 검사 규칙

validation 객체는 필드 유형에 따라 다릅니다. 전체 형태는 다음과 같습니다:

interface FieldValidation {
	required?: boolean; // 모든 유형
	min?: number; // number, integer
	max?: number; // number, integer
	minLength?: number; // string, text
	maxLength?: number; // string, text
	pattern?: string; // string (정규식)
	options?: string[]; // select, multiSelect
}

다음 필드는 고유하고 패턴이 일치하는 이메일 주소를 요구합니다:

{
  slug: "email",
  type: "string",
  label: "Email Address",
  required: true,
  unique: true,
  validation: {
    pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
  }
}

위젯 옵션

options 객체는 필드별 UI 동작을 구성합니다. 전체 형태는 다음과 같습니다:

interface FieldWidgetOptions {
	rows?: number; // text (텍스트 영역 행)
	showPreview?: boolean; // image, file
	collection?: string; // reference (대상 컬렉션)
	allowMultiple?: boolean; // reference (다중 참조)
	[key: string]: unknown; // 사용자 정의 위젯 옵션
}

다음 참조 필드는 여러 제품에 연결합니다:

{
  slug: "relatedProducts",
  type: "reference",
  label: "Related Products",
  options: {
    collection: "products",
    allowMultiple: true
  }
}

컬렉션 쿼리

제공된 쿼리 함수를 사용하여 콘텐츠를 가져옵니다. 이들은 Astro의 라이브 컬렉션 패턴을 따르며 구조화된 결과를 반환합니다. 다음 예시는 일반적인 쿼리 옵션을 보여줍니다:

import { getEmDashCollection, getEmDashEntry } from "emdash";

// 모든 항목 가져오기 - { entries, error } 반환
const { entries: posts } = await getEmDashCollection("posts");

// 상태로 필터링
const { entries: drafts } = await getEmDashCollection("posts", {
	status: "draft",
});

// 결과 제한
const { entries: recent } = await getEmDashCollection("posts", {
	limit: 5,
});

// 택소노미로 필터링
const { entries: newsPosts } = await getEmDashCollection("posts", {
	where: { category: "news" },
});

// slug로 단일 항목 가져오기 - { entry, error, isPreview } 반환
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");

// 오류 처리
const { entries, error } = await getEmDashCollection("posts");
if (error) {
	console.error("Failed to load posts:", error);
}

유형 생성

npx emdash types를 실행하여 스키마에서 TypeScript 유형을 생성합니다. 생성된 파일에는 컬렉션당 하나의 인터페이스가 포함됩니다:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
	featuredImage?: string;
	author: string; // 참조 ID
}

export interface Product {
	title: string;
	price: number;
	description: PortableTextBlock[];
}

데이터베이스 매핑

필드 유형은 다음과 같이 SQLite 컬럼 유형에 매핑됩니다:

필드 유형SQLite 유형비고
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREAL64비트 부동소수점
integerINTEGER64비트 부호 있는 정수
booleanINTEGER0 또는 1
datetimeTEXTISO 8601 형식
selectTEXT
multiSelectJSON문자열 배열
portableTextJSON블록 배열
imageTEXT미디어 ID
fileTEXT미디어 ID
referenceTEXT항목 ID
jsonJSON임의의 JSON
repeaterJSON하위 필드 배열

다음 단계