master-project
CHAPTER 42 / 50
읽기 약 2분
FUNCTION
성능 최적화: Lighthouse 90+ 달성
핵심 개념
Core Web Vitals·Image·번들·Streaming SSR·prefetch — 사용자 체감 속도 최적화.
본문
Lighthouse 4가지 지표
[Performance] Core Web Vitals
- LCP (Largest Contentful Paint): < 2.5s
- INP (Interaction to Next Paint): < 200ms
- CLS (Cumulative Layout Shift): < 0.1
[Accessibility] 100점 (a11y)
[Best Practices] 100점 (보안·HTTPS)
[SEO] 100점 (메타·sitemap)next/image 최적화
import Image from 'next/image'
<Image
src={imageUrl}
alt="..."
width={400}
height={300}
priority={isAboveFold} // 첫 화면은 priority
loading={isAboveFold ? 'eager' : 'lazy'}
placeholder="blur"
blurDataURL={blurUrl}
/>
// 자동: WebP/AVIF 변환·responsive srcset·lazy loadnext/font 최적화
import { Inter } from 'next/font/google'
import localFont from 'next/font/local'
const inter = Inter({
subsets: ['latin'],
display: 'swap', // FOUT 방지
variable: '--font-inter',
})
const pretendard = localFont({
src: './fonts/Pretendard.woff2',
variable: '--font-pretendard',
display: 'swap',
})
// CLS 0 (font 미리 reserve)동적 import (코드 분할)
import dynamic from 'next/dynamic'
const HeavyChart = dynamic(() => import('./heavy-chart'), {
loading: () => <Skeleton />,
ssr: false, // 클라이언트만 (큰 라이브러리)
})Streaming SSR (Suspense)
// src/app/(app)/dashboard/page.tsx
import { Suspense } from 'react'
export default function DashboardPage() {
return (
<div>
<h1>대시보드</h1> {/* 즉시 렌더 */}
<Suspense fallback={<Skeleton />}>
<SlowStats /> {/* 비동기 → 도착하면 streaming */}
</Suspense>
<Suspense fallback={<Skeleton />}>
<SlowChart />
</Suspense>
</div>
)
}
// → TTFB 빠름 + 점진적 로딩번들 사이즈 분석
ANALYZE=true pnpm build
# → bundle-analyzer 페이지에서 큰 라이브러리 확인// next.config.ts
import bundleAnalyzer from '@next/bundle-analyzer'
const withBundleAnalyzer = bundleAnalyzer({
enabled: process.env.ANALYZE === 'true',
})
export default withBundleAnalyzer(config)[큰 라이브러리 줄이기]
- moment.js (300KB) → date-fns (10KB)
- lodash 전체 → lodash-es 개별
- recharts 전체 → 필요한 컴포넌트만
- AI SDK 전체 → 필요한 provider만prefetch (Next.js Link 자동)
import Link from 'next/link'
// 화면에 보이면 자동 prefetch
<Link href="/dashboard" prefetch={true}>대시보드</Link>
// 큰 페이지는 false (대역폭 절약)
<Link href="/heavy-page" prefetch={false}>...</Link>TanStack Query (캐시·prefetch)
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000, // 1분 fresh
gcTime: 5 * 60 * 1000, // 5분 캐시
refetchOnWindowFocus: false,
},
},
})
// useQuery, useMutationCDN 캐싱 (Vercel)
// 정적 데이터: ISR
export const revalidate = 3600 // 1시간
// 빌드 시 prerender
export async function generateStaticParams() {
return templates.map(t => ({ id: t.id }))
}이미지 도메인 검증
- Vercel Analytics → Images optimized
- 큰 이미지 (>500KB) → Squoosh CLI로 압축
- target: 100KB 이하 (PageSpeed 권장)Lighthouse CI
# .github/workflows/lighthouse.yml
- uses: treosh/lighthouse-ci-action@v9
with:
urls: |
https://mysaas.com
https://mysaas.com/dashboard
uploadArtifacts: true
temporaryPublicStorage: true측정 (RUM)
// src/app/layout.tsx
import { SpeedInsights } from '@vercel/speed-insights/next'
import { Analytics } from '@vercel/analytics/react'
<SpeedInsights />
<Analytics />다음 챕터
CH.43 "보안 체크리스트: OWASP Top 10 점검".
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 마스터 프로젝트의 성능 최적화 부분을 분석해서 실전 적용 + 개선 우선순위 3가지를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
성능 최적화 관련 모범 사례·안티패턴 5개를 비교 분석해서 실전 적용를 위한 추천 방안을 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 성능 최적화 최적화 가능 위치와 리스크를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 1인 개발자 시장의 성능 최적화 트렌드와 차별화 포인트를 정리해줘.
⭐ 이것만 기억하세요
성능 최적화: Lighthouse 90+ 달성은 이 3가지만 확실히 잡으세요
1.Image + Font + dynamic import = 첫 화면 빠름
2.Streaming SSR + TanStack Query = 점진적 로딩
3.다음 챕터에서 보안 체크
공유하기
진행도 42 / 50