Astro로 정적 사이트 만들기 — 처음 써본 후기
Next.js 대신 Astro를 선택한 이유, 설치부터 배포까지 정리
이 블로그 자체가 Astro로 만들어져 있어요. 처음 써보면서 느낀 점들을 기록합니다.
왜 Astro를 골랐나
블로그를 만들 때 선택지가 몇 가지 있었어요.
- Next.js — 너무 무겁다. 서버 렌더링까지 필요 없음
- Gatsby — 예전에 써봤는데 빌드 느리고 GraphQL이 과함
- Hugo — Go 템플릿 문법이 낯섦
- Astro — 배워보고 싶었던 것, Markdown 지원이 깔끔함
결국 Astro를 골랐습니다.
핵심 개념 — Islands Architecture
Astro의 가장 큰 특징은 기본적으로 JavaScript를 하나도 안 보냄이에요.
---
// 이 부분은 빌드 타임에만 실행됨
const posts = await getCollection('posts');
---
<ul>
{posts.map(p => <li>{p.data.title}</li>)}
</ul>
위 코드는 빌드하면 순수 HTML로 변환돼요. React처럼 런타임에 JS가 실행되지 않습니다.
인터랙티브한 부분이 필요할 때만 client:load 같은 지시어로 명시적으로 수화(hydration)시킵니다. 이 개념을 “Islands Architecture”라고 부릅니다.
Content Collections
Markdown 글들을 타입 안전하게 관리할 수 있어요.
// src/content.config.ts
const posts = defineCollection({
schema: z.object({
title: z.string(),
category: z.enum(['dev', 'photo', 'music', 'writing', 'essay']),
pubDate: z.coerce.date(),
}),
});
getCollection('posts')로 가져오면 모든 frontmatter가 TypeScript 타입으로 자동 추론됩니다.
GitHub Pages 배포
astro.config.mjs에 site URL만 설정하면 GitHub Actions로 자동 배포가 됩니다.
- name: Build
run: npm run build
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: dist
main에 push하면 2~3분 안에 배포 완료예요.
느낀 점
Astro는 블로그처럼 콘텐츠 중심 사이트에 딱 맞습니다. 불필요한 복잡함 없이 Markdown 쓰고 배포하는 사이클이 깔끔해요.