OPEN HYPER STEP
← 목록으로 (master-project)
MASTER-PROJECT · 42 / 50
master-project
CHAPTER 42 / 50
읽기 약 2
FUNCTION

성능 최적화: Lighthouse 90+ 달성


핵심 개념

Core Web Vitals·Image·번들·Streaming SSR·prefetch — 사용자 체감 속도 최적화.

본문

Lighthouse 4가지 지표

📋 코드 (8줄)
[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 최적화

TSX📋 코드 (14줄)
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 load

next/font 최적화

TSX📋 코드 (16줄)
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 (코드 분할)

TSX📋 코드 (6줄)
import dynamic from 'next/dynamic'

const HeavyChart = dynamic(() => import('./heavy-chart'), {
  loading: () => <Skeleton />,
  ssr: false,  // 클라이언트만 (큰 라이브러리)
})

Streaming SSR (Suspense)

TSX📋 코드 (20줄)
// 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 빠름 + 점진적 로딩

번들 사이즈 분석

BASH📋 코드 (2줄)
ANALYZE=true pnpm build
# → bundle-analyzer 페이지에서 큰 라이브러리 확인
TS📋 코드 (8줄)
// next.config.ts
import bundleAnalyzer from '@next/bundle-analyzer'

const withBundleAnalyzer = bundleAnalyzer({
  enabled: process.env.ANALYZE === 'true',
})

export default withBundleAnalyzer(config)
📋 코드 (5줄)
[큰 라이브러리 줄이기]
- moment.js (300KB) → date-fns (10KB)
- lodash 전체 → lodash-es 개별
- recharts 전체 → 필요한 컴포넌트만
- AI SDK 전체 → 필요한 provider만

prefetch (Next.js Link 자동)

TSX📋 코드 (7줄)
import Link from 'next/link'

// 화면에 보이면 자동 prefetch
<Link href="/dashboard" prefetch={true}>대시보드</Link>

// 큰 페이지는 false (대역폭 절약)
<Link href="/heavy-page" prefetch={false}>...</Link>

TanStack Query (캐시·prefetch)

TSX📋 코드 (13줄)
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, useMutation

CDN 캐싱 (Vercel)

TS📋 코드 (7줄)
// 정적 데이터: ISR
export const revalidate = 3600  // 1시간

// 빌드 시 prerender
export async function generateStaticParams() {
  return templates.map(t => ({ id: t.id }))
}

이미지 도메인 검증

📋 코드 (3줄)
- Vercel Analytics → Images optimized
- 큰 이미지 (>500KB) → Squoosh CLI로 압축
- target: 100KB 이하 (PageSpeed 권장)

Lighthouse CI

YAML📋 코드 (8줄)
# .github/workflows/lighthouse.yml
- uses: treosh/lighthouse-ci-action@v9
  with:
    urls: |
      https://mysaas.com
      https://mysaas.com/dashboard
    uploadArtifacts: true
    temporaryPublicStorage: true

측정 (RUM)

TS📋 코드 (6줄)
// 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