← 모든 글

작고 오래가는 블로그의 구조

새 기능보다 글을 계속 쓸 수 있는 구조를 먼저 선택한 이유와 Astro로 이를 구현하는 방법을 정리합니다.

이 글의 목차

개인 블로그를 만들 때 가장 먼저 떠올리기 쉬운 질문은 “어떤 기능을 넣을까?”다. 검색, 태그, 댓글, 뉴스레터를 차례로 적다 보면 목록은 금방 길어진다. 하지만 실제로 블로그를 오래 운영하게 만드는 질문은 조금 다르다.

새 글을 쓰고 공개하는 일이 앞으로도 충분히 단순한가?

이 질문에 대한 답이 복잡하면 정교한 기능도 오래 살아남기 어렵다. 그래서 이 블로그는 Markdown 파일 하나를 추가하는 것만으로 목록, 글 페이지, RSS가 함께 갱신되도록 구성했다.

콘텐츠를 코드와 분리한다

페이지 안에 글 정보를 직접 적으면 처음에는 빠르다. 글이 세 편을 넘어가는 순간부터 날짜 형식, URL, 초안 처리 같은 규칙이 여러 파일에 흩어진다. 콘텐츠 컬렉션은 그 규칙을 한곳으로 모은다.

const posts = defineCollection({
  loader: glob({ pattern: '**/*.md', base: './src/content/posts' }),
  schema: z.object({
    title: z.string(),
    description: z.string(),
    publishedAt: z.coerce.date(),
    updatedAt: z.coerce.date().optional(),
    draft: z.boolean().default(false),
  }),
});

스키마의 역할은 입력을 번거롭게 만드는 것이 아니다. 제목이 빠진 글이나 날짜 형식이 잘못된 글을 독자보다 빌드가 먼저 발견하게 하는 안전장치다. 글쓴이는 본문에 집중하고, 사이트는 일관성을 책임진다.

파일명이 주소가 된다

small-durable-blog.md라는 파일은 /posts/small-durable-blog/라는 주소가 된다. 제목을 고쳐도 주소는 유지되므로 이미 공유된 링크가 깨지지 않는다. URL을 제목에서 매번 자동 생성하는 방식보다 한 번 더 의식적으로 파일명을 정하는 편이 장기적으로 안전하다.

정적 페이지를 기본값으로 둔다

읽기 전용 블로그는 방문할 때마다 데이터베이스를 조회할 이유가 거의 없다. 글이 바뀌는 시점은 배포할 때뿐이므로, 모든 페이지를 미리 만들어 두는 정적 렌더링이 문제의 성격과 잘 맞는다.

기준 정적 렌더링 요청 시 렌더링
첫 응답 미리 만든 HTML 전달 서버에서 HTML 생성
운영 요소 파일과 배포 서버와 런타임 상태
블로그 적합성 매우 높음 동적 기능이 있을 때 유용

여기서 중요한 것은 속도 점수 자체가 아니다. 실패할 수 있는 요소가 적다는 점이다. 서버 상태나 데이터베이스 연결이 없어도 글은 그대로 열리고, 브라우저가 자바스크립트를 실행하지 못해도 본문을 읽을 수 있다.

자바스크립트는 행동에만 쓴다

이 블로그에도 자바스크립트는 있다. 테마 선택을 기억하고, 코드 복사 버튼을 동작시키고, 긴 글의 현재 목차를 표시한다. 반면 제목, 날짜, 글 목록처럼 이미 HTML로 표현할 수 있는 내용은 스크립트로 다시 만들지 않는다.

이 구분은 번들 크기보다 설계 의도를 선명하게 한다. 자바스크립트가 실패했을 때 잃는 것은 편의 기능이어야지 글 자체여서는 안 된다.

기능보다 운영 흐름을 설계한다

좋은 구조는 파일 개수가 적은 구조가 아니라, 수정의 영향 범위를 예상할 수 있는 구조다. 이 블로그에서 새 글을 공개하는 흐름은 다음 네 단계다.

  1. 기존 글을 복사해 제목과 날짜를 바꾼다.
  2. Markdown으로 본문을 쓴다.
  3. 로컬에서 문장과 코드 블록을 확인한다.
  4. 빌드가 스키마와 링크를 검증한 뒤 공개한다.

검색이나 댓글이 필요해지는 시점이 오면 추가할 수 있다. 다만 “있으면 좋아 보인다”는 이유만으로 현재의 단순한 흐름을 복잡하게 만들지는 않는다. 사용되지 않는 기능도 계속 관리해야 하는 제품의 일부이기 때문이다.

작은 구조가 남기는 여유

블로그의 핵심 자산은 화면이 아니라 글이다. 화면은 글을 발견하고 읽고 다시 돌아오는 일을 방해하지 않아야 한다. 콘텐츠 컬렉션, 정적 페이지, 제한된 자바스크립트는 눈에 띄는 기능은 아니지만 그 역할을 꾸준히 수행한다.

작게 시작한다는 것은 대충 시작한다는 뜻이 아니다. 무엇을 오래 지킬지 먼저 정하고, 나머지를 의도적으로 비워 두는 일에 가깝다.