astro + tailwind로 이전 했습니다.
또 이사냐고요? 네, 또 이사입니다.
블로그는 ‘글을 쓰는 공간’이기도 하지만, 저한텐 동시에 기술 스택을 가볍게 실험해볼 수 있는 샌드박스이기도 합니다.
예전에 Gatsby로 한번 옮겼고, 그 다음엔 Next.js로 옮겼습니다. (그때도 “다시 블로그를 시작해봅니다”라고 썼네요.)
이번엔 Astro + Tailwind로 정착(?)을 시도했습니다.
왜 Next.js에서 Astro로?
Next.js는 좋은 프레임워크입니다. 다만 “정적 블로그”라는 목적에 한정하면, 시간이 지날수록 이런 생각이 들었습니다.
- 내가 필요한 건 SSR/ISR이 아니라, 결국 정적 페이지
- 빌드 파이프라인/의존성/렌더링 계층이 커질수록 “블로그 유지보수”가 프로젝트처럼 변함
- 마크다운 기반 콘텐츠가 많아질수록, React 레이어가 오히려 부담
Astro는 이 지점에서 매력적이었습니다.
- 기본 철학이 Content-first / SSG 친화적
- React를 “필요한 컴포넌트만” 섞어 쓸 수 있음(아일랜드)
- 결과물이 단순하게 떨어져서 GitHub Pages 같은 정적 호스팅에 잘 맞음
이번 마이그레이션 목표
이번 이주에서 목표는 딱 4가지였습니다.
- 빌드/배포 단순화 (정적 생성 + GitHub Pages 유지)
- 마크다운 작성 경험 개선 (TOC, 코드 블럭, typography)
- 디자인 시스템 정리 (light/dark + 토큰화된 컬러)
- “나중에 내가 봐도” 유지보수하기 쉬운 구조로 정리
핵심 구조: Layout + Content Slot + Typography
Astro의 글 페이지는 결국 이렇게 정리됐습니다.
- 글 메타(title/date/tags/image)는 frontmatter 기반
- 상단 헤더(제목/날짜/태그/커버)는 컴포넌트로 고정
- 본문은
<slot />로 넣고, 그 영역에prose를 적용
예시(개념):
<BaseLayout title={title} description={summary}>
<header>
<h1 class="text-3xl font-bold tracking-tight">{title}</h1>
<div class="text-muted text-sm">
<FormattedDate date={date} />
</div>
</header>
<div class="prose lg:prose-xl dark:prose-invert mx-auto">
<slot />
</div>
</BaseLayout>
Tailwind 4.x에서 “h1이 안 먹히는” 이유와 해결
이주하면서 가장 당황했던 포인트 중 하나가 이거였습니다.
“마크다운 본문(slot) 안의 h1/h2가 다 기본값처럼 보이는데?”
Tailwind v4는 기본적으로 의미(semantic)는 남기되, 태그 스타일은 강하게 주지 않는 방향으로 바뀌었습니다. 그래서 “태그 자체(h1/h2/p)”에 기대면 안 되고, 콘텐츠 영역에는 Typography 플러그인을 쓰는 쪽이 정석입니다.
1) typography 플러그인 활성화
global.css 상단에:
@import 'tailwindcss';
@plugin '@tailwindcss/typography';
2) 본문 영역에 prose 적용
<div class="prose dark:prose-invert">
<!-- markdown content -->
</div>
이렇게 하면 마크다운의 h1/h2/ul/blockquote/code가 전부 자연스럽게 스타일을 갖게 됩니다.
디자인 시스템: “클래스”보다 “토큰”을 먼저
이번엔 컬러를 “대충 bg-gray-100 / dark:bg-gray-800”로 밀어붙이면, 나중에 테마를 바꾸려 할 때 HTML을 다시 갈아엎어야 한다는 걸 절감했습니다.
그래서 Tailwind v4의 CSS-first 방식에 맞춰:
:root / .dark에 OKLCH 컬러 토큰 선언@theme inline에서 Tailwind 토큰으로 매핑- 컴포넌트는 최대한
bg-background,text-foreground,bg-muted,text-muted-foreground같은 의미 기반 클래스로 통일
이 방식의 장점은 분명합니다.
- 테마를 바꿀 때 CSS 변수만 교체하면 전체 UI가 바뀜
- light/dark 대비를 유지하기 쉬움
- prose(typography)까지 포함해서 톤을 한 번에 맞추기 쉬움
이주하면서 느낀 점
- “블로그는 블로그답게”: Astro는 글을 위한 프레임워크라는 느낌이 강했습니다.
- 속도가 빠르다: 빌드/번들/로컬 개발이 가볍습니다.
- Tailwind는 결국 디자인 시스템의 언어: class 남발보다 토큰화가 훨씬 오래 갑니다.
다음 할 일
당장은 “글을 더 자주 쓰는 것”이 제일 중요하니, 기술 욕심은 잠깐 접어두고…
- TOC 자동 생성 개선
- 조회수/통계(Analytics)는 다음번에 😅
마무리
Gatsby → Next.js → Astro까지 오면서 느끼는 건 결국 하나입니다.
내가 글을 쓰는 속도를 방해하지 않는 도구가 제일 좋은 도구다.
이번엔 Astro + Tailwind 조합이 꽤 오래 갈 것 같습니다.
관련 태그 글
STL 파일을 올리면 3D 프린팅 시간·재료·비용을 계산하는 브라우저 도구를 만들었다
STL 파일을 서버로 올리지 않고 브라우저 안에서 분석해 3D 프린팅 예상 시간, 필라멘트 사용량, 비용과 출력 주의사항을 계산하는 도구를 만들었다.
GA4 조회수를 사이트에 그대로 보여주지 않기로 한 이유
GitHub Pages 블로그는 그대로 두고, 공개 조회수만 Cloudflare Worker와 D1으로 분리하기로 했다. GA4 baseline을 안전하게 이어 붙이고 익명 중복을 제한하는 기준을 정리한다.