Next.js 15 App Router + Tailwind CSS + Supabase 기반 프론트엔드 프로젝트 초기화, 페이지 라우팅, 데이터 페칭, SEO, 다국어(한/영) 지원을 구축하는 스킬. Next.js 프로젝트 설정, 페이지 생성, Supabase 클라이언트 통합, 타입 정의가 필요하면 반드시 이 스킬을 사용할 것.
npx create-next-app@latest . --typescript --tailwind --app --src-dir --turbopack
npm install @supabase/supabase-js framer-motion lucide-react
npm install -D @types/node
src/
├── app/
│ ├── layout.tsx # 루트 레이아웃 (다크모드, 폰트, 메타)
│ ├── page.tsx # 홈 — 히어로 + 하이라이트 + 통계
│ ├── cases/
│ │ ├── page.tsx # 복원 사례 목록 (필터/검색/그리드)
│ │ └── [id]/
│ │ └── page.tsx # 개별 사례 상세 (Before/After 슬라이더)
│ ├── timeline/
│ │ └── page.tsx # 연도별 타임라인 시각화
│ ├── gallery/
│ │ └── page.tsx # 전체 갤러리 (Masonry + Lightbox)
│ ├── prevention/
│ │ └── page.tsx # 훼손예방 사례
│ ├── about/
│ │ └── page.tsx # 소개 페이지
│ └── api/
│ └── og/
│ └── route.tsx # OG 이미지 동적 생성
├── components/ # ui-craftsman이 생성
├── lib/
│ ├── supabase/
│ │ ├── client.ts # 브라우저 클라이언트
│ │ ├── server.ts # 서버 클라이언트
│ │ └── queries.ts # 데이터 페칭 함수
│ └── utils.ts # 유틸리티
├── hooks/ # 커스텀 훅
├── types/
│ ├── database.ts # Supabase 자동생성 타입
│ └── index.ts # 앱 타입 정의
└── styles/
└── globals.css # Tailwind + CSS 변수
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx
Server Component에서 직접 Supabase 쿼리:
// src/lib/supabase/queries.ts
import { createClient } from './server'
export async function getRestorationCases(filters?: {
category?: string
year?: number
orgId?: string
}) {
const supabase = await createClient()
let query = supabase
.from('restoration_cases')
.select('*, organizations(name), case_images(*)')
.order('support_year', { ascending: false })
if (filters?.category) query = query.eq('category', filters.category)
if (filters?.year) query = query.eq('support_year', filters.year)
if (filters?.orgId) query = query.eq('requesting_org_id', filters.orgId)
const { data, error } = await query
if (error) throw error
return data
}
generateMetadata 함수 정의robots.txt, sitemap.xml 자동 생성next/image로 모든 이미지 최적화Suspense 경계로 스트리밍 SSRdynamic(() => import(...)) 으로 무거운 컴포넌트 분리_workspace/02_frontend_routes.md — 페이지 라우트 맵