블로그 2호점을 Astro로 올리면서, 글 관리 방식을 Content Collections로 통일했습니다. 이 글은 그 선택 이유와 기본 설정을 짧게 정리합니다.
왜 Content Collections인가
티스토리 본진은 에디터 중심이지만, 자체 호스팅 2호점은 Git + Markdown이 자연스럽습니다. Content Collections를 쓰면:
- frontmatter가 Zod 스키마로 검증됩니다
- 빌드 시점에 잘못된 메타데이터를 바로 잡을 수 있습니다
- TypeScript에서
getCollection('blog')결과가 타입 추론됩니다
Astro 5 glob loader 예시
src/content.config.ts에서 컬렉션을 이렇게 정의할 수 있습니다.
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
const blog = defineCollection({
loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
schema: z.object({
title: z.string(),
description: z.string(),
pubDate: z.coerce.date(),
tags: z.array(z.string()).default([]),
draft: z.boolean().default(false),
}),
});
export const collections = { blog };
src/content/blog/ 아래에 .md 또는 .mdx 파일을 추가하면 빌드 시 자동으로 수집됩니다.
draft와 게시 필터
draft: true인 글은 목록·RSS·정적 경로 생성에서 제외하는 패턴이 일반적입니다.
const posts = await getCollection('blog', ({ data }) => !data.draft);
로컬에서 초안을 쓰다가, 준비되면 draft: false로 바꾸고 커밋하면 됩니다.
2호점에서의 역할
- 본진(티스토리): 검색 유입, 한국어 독자
- 2호점(Astro): MDX 실험, 코드 스니펫, CI/CD, RSS/사이트맵
두 채널을 분리해 운영하되, 소스는 이 저장소와 pipeline/ 워크플로로 관리합니다. 마이그레이션은 하지 않고, 앞으로 쓸 글부터 2호점에 올리는 방식입니다.
마무리
Content Collections는 설정 한 번으로 글 품질(메타데이터 일관성)을 지키기 좋습니다. 다음 단계로는 Cloudflare Pages에 연결해 main 푸시마다 자동 배포하는 것을 예정하고 있습니다.