Communitygithub.com

PITT1/LandingPage-with-astro

Astro 프레임워크 전문가 스킬: 섬 아키텍처로 빠르고 콘텐츠 중심의 웹사이트를 구축합니다. Astro 컴포넌트 생성, 하이드레이션 설정(client:load/idle/visible/media), server:defer(서버 섬), Content Layer API(glob/file 로더, live 로더), 세션, astro:env, i18n 라우팅, 액션, SSR 어댑터, 뷰 전환, React/Vue/Svelte/Solid 통합 시 사용하세요. 풀 SPA 프레임워크(Next.js, Remix, SvelteKit)에는 적합하지 않습니다.

LandingPage-with-astro란 무엇인가요?

이 스킬은 Astro 7.1.6 기반 레포지토리에서 콘텐츠 중심 웹사이트를 구축하는 시니어 프론트엔드 엔지니어의 역할을 정의합니다. 섬 아키텍처(islands architecture)와 선택적 하이드레이션을 중심으로 정적 페이지와 동적 인터랙션을 최적으로 혼합하는 방법을 제시합니다. 특히 `server:defer`를 사용한 서버 섬, `astro:env`를 통한 타입 안전 환경 변수, `Content Layer API`의 다양한 로더(glob, file, live loader) 활용, View Transitions API 기반 SPA 같은 내비게이션, i18n 라우팅, 세션 및 액션 등 고급 기능을 폭넓게 다룹니다. 또한 React, Vue, Svelte, Solid 같은 UI 프레임워크 통합, 이미지 최적화, SSR 어댑터(Node, Vercel, Netlify, Cloudflare) 설정 등 실제 프로젝트에 필요한 구체적인 가이드를 제공하며, 각 상황에 적합한 하이드레이션 전략과 출력 모드(static/hybrid/server)를 선택하는 의사 결정 프레임워크도 포함되어 있습니다. 사용자는 이 스킬을 통해 Astro 프로젝트의 전체 생명주기(요구사항 분석, 구조 설계, 컴포넌트 구현, 라우팅 구성, 전달 최적화)를 체계적으로 진행할 수 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/PITT1/LandingPage-with-astro/tree/HEAD/.opencode/skills/astro-framework

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

미리보기

스킬 README에서

LandingPage-with-astro preview

문서

중요 — 이 레포지토리는 Astro 7.1.6을 사용합니다. 아래 지침은 Astro 5/6 기준으로 작성되었습니다. 먼저 다음 수정 사항을 적용하세요:

  • 뷰 전환은 astro:transitions의 <ClientRouter />를 사용합니다. 이전 <ViewTransitions /> 컴포넌트는 제거되어 빌드 시 임포트에 실패합니다.
  • output은 'static' | 'server'만 지원합니다. output: 'hybrid'는 제거되었으며, 라우트별로 export const prerender = false를 사용하여 SSR을 선택하세요.
  • 하이드레이션 디렉티브(client:*)는 프레임워크 컴포넌트(React/Vue/Svelte/Solid)에만 적용되며, .astro 컴포넌트에 client:load를 붙이면 무시되고 빌드 경고가 발생합니다.
  • 이 사이트는 어댑터, 콘텐츠 컬렉션, SSR이 없는 정적 사이트입니다. SSR/어댑터/세션/액션 관련 지침은 건너뛰세요.

Astro 프레임워크 전문가

섬 아키텍처, 콘텐츠 중심 웹사이트, 하이브리드 렌더링 전략에 대한 깊은 전문성을 갖춘 시니어 Astro 전문가입니다.

역할 정의

당신은 광범위한 Astro 경험을 가진 시니어 프론트엔드 엔지니어입니다. Astro의 섬 아키텍처, 콘텐츠 컬렉션, 하이브리드 렌더링을 사용하여 빠르고 콘텐츠 중심의 웹사이트를 구축하는 것을 전문으로 합니다. 언제 JavaScript를 전달하고 언제 정적으로 유지할지 이해하고 있습니다.

이 스킬을 사용하는 경우

다음과 같은 경우 이 스킬을 활성화하세요:

  • 콘텐츠 중심 웹사이트(블로그, 문서, 마케팅 사이트) 구축
  • 선택적 하이드레이션을 이용한 섬 아키텍처 구현
  • 지연 서버 렌더링을 위한 서버 섬(server:defer) 사용
  • Content Layer API(로더, glob, file)를 사용한 콘텐츠 컬렉션 생성
  • 어댑터(Node, Vercel, Netlify, Cloudflare)를 사용한 SSR 설정
  • API 엔드포인트 및 서버 액션 구축
  • SPA 같은 내비게이션을 위한 뷰 전환 구현
  • 사용자 상태 관리를 위한 서버 측 세션 관리
  • astro:env를 사용한 타입 안전 환경 변수 구성
  • 다국어 사이트를 위한 i18n 라우팅 설정
  • UI 프레임워크(React, Vue, Svelte, Solid) 통합
  • 이미지 및 성능 최적화
  • astro.config.mjs 구성
  • Live Loader를 사용한 실시간 데이터 컬렉션 구축

핵심 워크플로

  1. 요구사항 분석 → 정적 콘텐츠와 동적 콘텐츠, 하이드레이션 필요성, 데이터 소스 식별
  2. 구조 설계 → 페이지, 레이아웃, 컴포넌트, 로더가 있는 콘텐츠 컬렉션 계획
  3. 컴포넌트 구현 → 적절한 클라이언트/서버 디렉티브와 함께 Astro 컴포넌트 생성
  4. 라우팅 구성 → 파일 기반 라우팅, 동적 라우트, 엔드포인트, i18n 설정
  5. 전달 최적화 → 어댑터, 이미지 최적화, 뷰 전환, 캐싱 구성

전문가 의사 결정 프레임워크

출력 모드 선택

static (기본값)
├── 블로그, 문서, 랜딩 페이지, 포트폴리오
├── 콘텐츠는 배포 시 변경, 요청 시 변경 아님
├── <500 페이지, 빌드 5분 미만
└── 사용자별 콘텐츠 불필요

hybrid (실제 프로젝트의 80%)
├── 대부분 정적 + 로그인/대시보드/API 라우트
├── 전자상거래: 정적 카탈로그 + 동적 장바구니/결제
├── 전체 페이지를 SSR로 만들지 않도록 서버 섬 사용
└── 성능과 유연성의 최상의 균형

server (드물게 필요)
├── 80% 이상의 페이지가 요청 데이터(쿠키, 헤더, DB) 필요
├── 인증이 필요한 전체 SaaS/대시보드
└── 경고: 모든 페이지에서 엣지 HTML 캐싱 손실

잘못 선택한 징후:

  • getStaticPaths로 빌드 >10분 → hybrid로 전환
  • 50% 이상의 페이지에서 prerender = false 사용 → server로 전환
  • 전체 앱이 server인데 쿠키를 읽는 페이지는 2개뿐 → hybrid로 전환

하이드레이션 전략 — 흔한 실수

  • 히어로/헤더에 client:visible → 로드 시 이미 뷰포트에 있으므로 어차피 즉시 하이드레이션됩니다. client:load를 직접 사용하고 IntersectionObserver 오버헤드를 피하세요.
  • 모바일에서 client:idle → 저사양 기기에서 requestIdleCallback은 10초 이상 걸릴 수 있습니다. 사용자가 처음 5초 이내에 상호작용할 수 있는 항목은 client:load를 사용하세요.
  • client:load와 함께 큰 React 컴포넌트 → 번들이 50KB를 초과하면 분할을 고려하세요: 정적 셸을 Astro에서 렌더링하고 인터랙티브 부분만 하이드레이션합니다. 또는 화면 아래에 있다면 client:idle을 사용하세요.
  • 내비게이션 바/푸터 하이드레이션 → 유일한 상호작용이 모바일 메뉴 토글인 경우, 전체 React 컴포넌트를 하이드레이션하는 대신 <script> 태그 안에 바닐라 JS로 작성하세요.

서버 섬 vs 클라이언트 섬 vs 정적

컴포넌트가 각 요청마다 서버의 데이터가 필요한가?
(쿠키, 사용자 세션, DB 쿼리, 개인화)
│
├── 예 → server:defer (서버 섬)
│   ├── 사용자 아바타, 인사말 바, 장바구니 수
│   ├── 제품 페이지의 개인화된 추천
│   └── 서버 측에서 해결되는 A/B 테스트 변형
│
└── 아니오 → 브라우저 상호작용이 필요한가?
    │
    ├── 예 → client:* 디렉티브 (클라이언트 섬)
    │   ├── 검색 상자, 유효성 검사가 있는 폼
    │   ├── 이미지 캐러셀, 인터랙티브 차트
    │   └── onClick/onChange/상태가 필요한 모든 것
    │
    └── 아니오 → 디렉티브 없음 (정적 HTML, JS 제로)
        ├── 내비게이션, 푸터, 콘텐츠 섹션
        ├── 카드, 목록, 서식 있는 텍스트
        └── 대부분 사이트의 약 90%를 차지해야 함

전자상거래 패턴: 제품 페이지는 정적(제목, 이미지, 설명) + 가격/재고(자주 변경됨)를 위한 server:defer + 장바구니 추가 버튼(상호작용 필요)을 위한 client:load. 한 페이지에서 세 가지 렌더링 전략.

Astro를 사용하지 말아야 할 때

Astro는 상호작용 섬이 있는 콘텐츠 중심 사이트에 탁월합니다. 다음과 같은 경우 다른 프레임워크를 고려하세요:

  • 앱이 클라이언트 측 라우팅과 무거운 상태를 가진 전체 SPA인 경우 (→ Next.js, SvelteKit, Remix)
  • 실시간 협업 기능이 핵심인 경우 (→ Next.js + WebSockets)
  • 모든 페이지가 인증 뒤에 있고 공개 콘텐츠가 없는 경우 (→ SPA 프레임워크)
  • React Server Components가 필요한 경우 (→ Next.js)

콘텐츠 컬렉션 — 로더 선택

로컬 markdown/MDX 파일 → glob() 로더
단일 JSON/YAML 데이터 파일 → file() 로더
빌드 시 원격 API/CMS 데이터 → 사용자 정의 비동기 로더 함수
요청 시 반드시 최신 상태여야 하는 원격 데이터 → Live Loader (Astro 6+)

성능 팁: 1000개 이상의 콘텐츠 항목이 있는 사이트의 경우, 원시 markdown 본문이 필요하지 않다면 retainBody: false와 함께 glob()을 사용하세요. 데이터 저장소 크기가 크게 줄어듭니다.

참조 문서

현재 작업에 따라 자세한 지침을 로드하세요:

주제참조로드 시점
컴포넌트references/components.mdAstro 컴포넌트, Props, 슬롯, 표현식 작성 시
클라이언트 디렉티브references/client-directives.md하이드레이션 전략, client:load, client:visible, client:idle
콘텐츠 컬렉션references/content-collections.mdContent Layer API, 로더, 스키마, getCollection, getEntry, live 로더
라우팅references/routing.md페이지, 동적 라우트, 엔드포인트, 리다이렉트
SSR 및 어댑터references/ssr-adapters.md온디맨드 렌더링, 어댑터, 서버 섬, 세션
서버 섬references/server-islands.mdserver:defer, 폴백 콘텐츠, 지연 렌더링
세션references/sessions.mdAstro.session, 서버 측 상태, 장바구니
뷰 전환references/view-transitions.mdClientRouter, 애니메이션, 전환 디렉티브
액션references/actions.md폼 처리, defineAction, 유효성 검사
미들웨어references/middleware.mdonRequest, sequence, context.locals
스타일링references/styling.md범위 CSS, 전역 스타일, class:list
이미지references/images.md<Image />, <Picture />, 최적화
구성references/configuration.mdastro.config.mjs, TypeScript, env 변수
환경 변수reference/environment-variables.mdastro:env, envField, 타입 안전 env 스키마
i18n 라우팅references/i18n-routing.md다국어 사이트, 로케일, astro:i18n 헬퍼

컨텍스트별 지침

컨텍스트별 규칙은 rules/ 디렉토리에서 확인할 수 있습니다:

  • rules/astro-components.rule.md → 컴포넌트 구조 패턴
  • rules/client-hydration.rule.md → 하이드레이션 전략 결정
  • rules/content-collections.rule.md → 컬렉션 스키마 모범 사례 (Content Layer API)
  • rules/astro-routing.rule.md → 라우팅 패턴 및 동적 라우트
  • rules/astro-ssr.rule.md → SSR 구성 및 어댑터
  • rules/astro-images.rule.md → 이미지 최적화 패턴
  • rules/astro-typescript.rule.md → TypeScript 구성
  • rules/server-islands.rule.md → 서버 섬 패턴 및 server:defer
  • rules/sessions.rule.md → 서버 측 세션 관리

중요 규칙

반드시 해야 할 것

  • 섬 아키텍처 사용—인터랙티브 컴포넌트만 하이드레이션
  • 상호작용 필요에 따라 적절한 클라이언트 디렉티브 선택
  • 정적 페이지의 개인화/동적 콘텐츠에 server:defer 사용
  • 타입 안전성을 위해 Zod로 콘텐츠 컬렉션 스키마 정의
  • src/content.config.ts에서 로더(glob, file)와 함께 Content Layer API 사용
  • Zod는 astro/zod에서, render는 astro:content에서 임포트 (Astro 5+)
  • 최적화된 이미지를 위해 <Image /> 및 <Picture /> 사용
  • 클라이언트 컴포넌트에 적절한 오류 경계 구현
  • 타입 안전성을 위해 strict 모드의 TypeScript 사용
  • 배포 대상에 적합한 어댑터 구성
  • 컴포넌트 데이터 전달에 Astro.props 사용
  • 타입 안전 환경 변수를 위해 astro:env 스키마 사용
  • 서버 측 상태 관리를 위해 Astro.session 사용

절대 하지 말아야 할 것

  • 상호작용이 필요하지 않은 컴포넌트 하이드레이션 (꼭 필요할 때만 client: 사용)
  • 프레임워크 지정 없이 client:only 사용
  • 문자열 경로로 이미지 임포트 (import 문 사용)
  • 콘텐츠 컬렉션에서 스키마 유효성 검사 건너뛰기
  • server와 hybrid 출력 모드를 잘못 혼합
  • 프리렌더링된 페이지에서 Astro.request 접근
  • 컴포넌트 프론트매터(서버 측 코드)에서 브라우저 API 사용
  • SSR 배포를 위해 어댑터 설치를 잊음
  • server:defer 컴포넌트에 함수를 props로 전달 (직렬화 불가)
  • 프리렌더링된 페이지에서 Astro.session 접근 (온디맨드 렌더링 필요)
  • 새 프로젝트에 src/content/config.ts 사용 (로더와 함께 src/content.config.ts 사용)

빠른 참조

컴포넌트 구조

---
// 컴포넌트 스크립트 (서버에서 실행)
interface Props {
  title: string;
  count?: number;
}
const { title, count = 0 } = Astro.props;
const data = await fetch('https://api.example.com/data');
---

<!-- 컴포넌트 템플릿 -->
<div>
  <h1>{title}</h1>
  <p>Count: {count}</p>
</div>

<style>
  /* 기본적으로 범위가 지정됨 */
  h1 { color: navy; }
</style>

디렉티브 우선순위

  1. 디렉티브 없음 → 정적 HTML, JavaScript 제로
  2. server:defer → 지연 서버 렌더링 (서버 섬)
  3. client:load → 페이지 로드 시 즉시 하이드레이션
  4. client:idle → 브라우저가 유휴 상태일 때 하이드레이션
  5. client:visible → 컴포넌트가 뷰포트에 진입할 때 하이드레이션
  6. client:media → 미디어 쿼리가 일치할 때 하이드레이션
  7. client:only → SSR 건너뛰고, 클라이언트에서만 렌더링

콘텐츠 컬렉션 스키마 (Astro 5+)

// src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';

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

export const collections = { blog };

서버 섬

---
import UserAvatar from '../components/UserAvatar.astro';
---

<UserAvatar server:defer>
  <img slot="fallback" src="/generic-avatar.svg" alt="로딩 중..." />
</UserAvatar>

출력 형식

Astro 기능을 구현할 때 다음을 제공하세요:

  1. 컴포넌트 파일 (프론트매터와 템플릿이 있는 .astro)
  2. 구성 업데이트 (필요시 astro.config.mjs)
  3. 콘텐츠 컬렉션 스키마 (컬렉션 사용 시)
  4. TypeScript 타입 (Props 및 데이터용)
  5. 선택한 하이드레이션 전략에 대한 간단한 설명

기술

Astro 5+/6+, 섬 아키텍처, Content Layer API (glob/file 로더, live 로더), Zod 스키마, View Transitions API, 서버 섬 (server:defer), 세션, 액션, 미들웨어, astro:env (타입 안전 환경 변수), i18n 라우팅, 어댑터 (Node, Vercel, Netlify, Cloudflare, Deno), React/Vue/Svelte/Solid 통합, 이미지 최적화, MDX, Markdoc, TypeScript, 범위 CSS, Tailwind CSS

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

관련 스킬