이전 글에서 WordPress 기반 블로그를 Astro로 전환한 이유와 개선점을 다뤘습니다. 이번 글에서는 실제로 Astro 기반 블로그를 처음부터 구축하는 방법을 단계별로 안내하겠습니다. 🚀
🤔 왜 Astro인가?
WordPress 대신 SSG 선택
기존 WordPress 환경에서 겪었던 문제들을 해결하기 위해 SSG(Static Site Generation)를 선택했습니다. SSG는 빌드 시점에 모든 페이지를 정적 HTML로 생성하여 런타임에 서버 연산이 필요 없는 방식입니다.
프레임워크 비교 분석
Framework | MDX | TS | HMR | 빌드 | 학습 |
---|---|---|---|---|---|
Astro | ✅ 공식 지원 | ✅ 공식 지원 | 🚀 매우 빠름 | 🟢 빠름 | 🟢 쉬움 |
Gatsby | ✅ 공식 지원 | ✅ 공식 지원 | 🟡 보통 | 🔴 느림 | 🟡 보통 |
Hexo | ⚠️ 플러그인 필요 | ⚠️ 플러그인 필요 | ⚠️ livereload 지원 | 🟢 빠름 | 🟢 쉬움 |
Hugo | ❌ 지원 안됨 | ❌ 지원 안됨 | ⚠️ livereload 지원 | 🚀 매우 빠름 | 🟡 보통 |
Jekyll | ❌ 지원 안됨 | ❌ 지원 안됨 | ⚠️ livereload 지원 | 🟡 느림 | 🟢 쉬움 |
Astro를 선택한 핵심 이유
- MDX 지원: React 컴포넌트를 Markdown에 직접 삽입 가능
- TypeScript 지원: 타입 안정성과 개발 경험 향상
- Vite 기반 HMR: 초고속 Hot Module Replacement로 개발 효율성 극대화
- 빠른 빌드 속도: 대용량 콘텐츠도 빠르게 빌드
- 낮은 진입 장벽: HTML, JS, CSS, Markdown, MDX 등 익숙한 웹 기술을 그대로 활용할 수 있음
- Islands Architecture: 최신 웹 아키텍처 패턴으로 성능 최적화
Islands Architecture의 핵심 가치
Patterns.dev의 Islands Architecture 문서에 따르면, Astro는 “Islands Architecture를 기본으로 설계된 최초의 프레임워크” 입니다.
Islands Architecture란?
- 정적 HTML + 동적 컴포넌트: 페이지의 대부분은 정적 HTML로 렌더링하고, 필요한 부분만 “섬(islands)“처럼 독립적인 상호작용 컴포넌트로 구성
- 부분적 하이드레이션: 전체 페이지가 아닌 필요한 컴포넌트만 클라이언트에서 하이드레이션
- 점진적 향상: 정적 콘텐츠는 즉시 표시, 상호작용 기능은 점진적으로 로드
성능상 이점:
- JavaScript 번들 크기 대폭 감소: Next.js, Nuxt.js 대비 83% JavaScript 코드 감소
- 빠른 초기 로드: 정적 콘텐츠는 즉시 표시
- SEO 최적화: 서버에서 렌더링된 HTML로 검색 엔진 최적화
- 접근성 향상: 표준 HTML 링크와 네비게이션으로 접근성 개선
🚀 Astro 프로젝트 시작하기
프로젝트 구조
my-blog/
├── src/
│ ├── components/ # 재사용 가능한 컴포넌트
│ ├── layouts/ # 페이지 레이아웃
│ ├── pages/ # 라우팅 페이지
│ ├── data/ # 블로그 포스트 데이터
│ │ └── blog/
│ │ ├── _draft/ # 작성 중인 포스트
│ │ └── _releases/ # 릴리즈 포스트
│ ├── assets/ # 이미지, 아이콘 등
│ ├── styles/ # CSS 스타일
│ ├── utils/ # 유틸리티 함수
│ ├── config.ts # 사이트 설정
│ ├── constants.ts # 상수 정의
│ └── content.config.ts # 콘텐츠 스키마
├── public/ # 정적 자산 (favicon, og-image 등)
├── scripts/ # 빌드 스크립트
├── astro.config.ts # Astro 설정
└── tsconfig.json # TypeScript 설정
🎨 Starter Template 선택
Astro 템플릿 시스템
Astro는 공식 문서에서 다양한 스타터 템플릿을 제공합니다. 저는 스타터 템플릿 대신 AstroPaper를 선택했습니다.
AstroPaper 테마 선택 이유
AstroPaper를 선택한 주요 이유들:
핵심 기능
- Responsive Design: 모바일과 데스크톱 환경 모두 최적화
- Light & Dark Mode: 사용자 선호도에 따른 테마 전환
- Fuzzy Search: 블로그 내 포스트 검색 기능
- Sitemap & RSS Feed: SEO 최적화 및 구독자 편의
- Dynamic OG Image Generation: 소셜 미디어 공유 시 자동 이미지 생성
- Draft Posts: 작성 중인 포스트 관리
- Pagination: 긴 포스트 목록의 페이지네이션 지원
설치 및 적용
# AstroPaper 테마로 새 프로젝트 생성
npm create astro@latest my-blog -- --template satnaing/astro-paper
# 또는 기존 프로젝트에 테마 추가
npm install @astrojs/tailwind @tailwindcss/typography
설정 커스터마이징
AstroPaper는 src/config.ts
에서 주요 설정을 변경할 수 있습니다:
export const SITE = {
website: "https://myblog.com", // 블로그 주소
author: "작성자",
profile: "https://myblog.com", // 프로필 이미지 주소
desc: "개발 경험과 기술 인사이트를 공유합니다.",
title: "My Blog - 작성자의 기술 블로그",
ogImage: "og-image.jpg",
lightAndDarkMode: true, // 라이트 모드와 다크 모드 전환 기능 활성화
postPerIndex: 4, // 홈페이지에 보여지는 포스트 개수
postPerPage: 8, // 포스트 페이지에 보여지는 포스트 개수
scheduledPostMargin: 15 * 60 * 1000, // 15 minutes
showArchives: true,
showBackButton: true, // show back button in post detail
dynamicOgImage: true, // 모바일에서 포스트 페이지 접속 시 썸네일 이미지 동적 생성 기능 활성화
lang: "ko", // html lang code. Set this empty and default will be "en"
timezone: "Asia/Seoul", // Default global timezone (IANA format) https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
} as const;
📝 콘텐츠 작성
Markdown vs MDX
Astro는 기본 Markdown과 MDX를 모두 지원합니다:
---
title: "첫 번째 블로그 포스트"
author: "작성자"
pubDatetime: 2025-01-15T10:00:00Z
tags: ["Astro", "SSG", "블로그"]
---
# 첫 번째 블로그 포스트
이것은 일반 Markdown으로 작성된 포스트입니다.
## 코드 예제
```javascript
console.log("Hello, Astro!");
```
MDX를 사용하면 React 컴포넌트를 직접 삽입할 수 있습니다:
```mdx
---
title: "MDX 포스트 예제"
---
import InteractiveChart from '../components/InteractiveChart.astro'
# MDX 포스트
이것은 MDX 포스트입니다. React 컴포넌트를 직접 사용할 수 있습니다.
<InteractiveChart data={chartData} />
## 동적 콘텐츠
{/* JavaScript 표현식도 사용 가능 */}
{Math.random() > 0.5 ? "50% 확률로 보이는 텍스트" : ""}
콘텐츠 컬렉션
Astro의 Content Collections을 사용하면 타입 안전성을 확보할 수 있습니다:
// src/content/config.ts
import { defineCollection, z } from "astro:content";
const blog = defineCollection({
type: "content",
schema: z.object({
title: z.string(),
author: z.string(),
pubDatetime: z.date(),
tags: z.array(z.string()),
draft: z.boolean().optional(),
}),
});
export const collections = { blog };
🚀 배포 전략
Netlify 선택 이유
Astro 공식 튜토리얼에서 Netlify를 추천하고 있으며 아래와 같은 장점이 있습니다:
- 정적 사이트 호스팅: Astro의 SSG 특성과 완벽 호환
- CI/CD 파이프라인: Git push 시 자동 빌드 및 배포
- 글로벌 CDN: 전 세계 사용자에게 빠른 응답 속도
- 무료 요금제: 개인 블로그 운영에 충분한 기능
배포 설정
Netlify 공식 블로그의 Deploy an existing Git repository to Netlify 문서를 참고.
배포 과정:
- GitHub 저장소 연결: Netlify 대시보드에서 GitHub 저장소 연결
- 사이트 생성: “Add new site > Import an existing project” 선택
- 자동 배포: Netlify가
package.json
의build
스크립트를 자동으로 인식하여 배포
주요 장점:
- 기존 프로젝트 활용: 개발 중인 Astro 프로젝트를 그대로 배포
- Git 워크플로우 유지: 기존 개발 환경과 버전 관리 시스템 그대로 사용
- 자동화: Git push 시 자동 빌드 및 배포,
dist/
폴더 자동 설정 - 실시간 미리보기: 배포 전 빌드 결과를 미리 확인 가능
🎯 다음 단계
이제 기본적인 Astro 블로그가 구축되었습니다! 다음 글에서는 Giscus를 기반으로 한 댓글 시스템 구현에 대해 다루겠습니다.
구현 완료된 기능들
- ✅ Astro 기반 정적 사이트 생성
- ✅ AstroPaper 테마 적용 및 커스터마이징
- ✅ Markdown/MDX 콘텐츠 작성 환경
- ✅ Netlify를 통한 자동 배포
- ✅ TypeScript 지원 및 개발 환경 최적화
다음 글에서 다룰 내용
- 🔄 Giscus 댓글 시스템 아키텍처
- 🔑 GitHub GraphQL API 연동
- 🤖 빌드 시 자동 Discussion 생성
📚 참고 자료
- Astro 공식 문서
- Why Astro?
- Astro 설치 및 설정
- AstroPaper 테마
- Netlify 공식 블로그 - Astro 배포 가이드
- Astro Content Collections
Astro로 블로그를 구축하면서 느낀 점: 기존 WordPress의 복잡함과 성능 한계를 모두 해결할 수 있었습니다. 특히 개발 경험의 향상과 빌드 속도의 개선이 인상적이었습니다. 다음 글에서 댓글 시스템 구현을 통해 더욱 완성도 높은 블로그를 만들어보겠습니다! 🚀