Next.js
Next.js App Router(5) - 성능 최적화, 실전 팁
Kir93
2025. 7. 2. 10:09
728x90
반응형
Next.js App Router 드디어 마지막 편인 성능 최적화와 실전 팁입니다.
이번 편에서는 이전 편들의 총집 편이며, 실전적으로 바로 활용할 수 있는 방법들을 모아 봤습니다.
1. 서버 우선 아키텍처 설계 설계: 번들 최소화를 위한 근본 접근
- 모든 UI는 기본적으로 Server Component로 구현하여 JS 번들에서 제외, 클라이언트 렌더링 부하 제거
- 클라이언트 코드가 꼭 필요할 때만, 그리고 작은 단위로 분리해 use client 선언
- Next.js의 자동 코드 분할 덕분에 페이지 단위 JS 추출이 기본 제공
2. 코드 분할 & lazy loading: 다음 단계 지연 로딩
- next/dynamic과 React.lazy + Suspense 조합으로 대형 UI(모달, 차트 등)는 사용 시점에 로딩
- SSR 불필요한 Client Component엔 ssr: false 옵션 적용하거나, use client 내부에서만 로드
- 외부 라이브러리도 dynamic import로 로딩 타이밍 제어, useRef에 캐싱해 중복 로드 방지
import dynamic from 'next/dynamic';
const HeavyChart = dynamic(() => import('../components/Chart'), { ssr: false, loading: () => <Spinner /> });
export default function Dashboard() {
return <HeavyChart />;
}
3. 중복 패칭 방지 & fetch 위치 조절
- 서버컴포넌트에서 데이터 패칭을 한 번만—layout에서 공통(fetch user/session 등) 처리
- 반복적인 fetch는 Next.js의 fetch 캐싱 덕에 동일 요청 자동 메모이제이션
- React context 대신 page 전역에서 캐시 된 data prop 전달로 client 컴포넌트 라이프사이클 간소화
// layout.js
export default async function RootLayout() {
const user = await fetch('/api/user', { cache: 'force-cache' }).then((res) => res.json());
return (
<html>
<body>
<Providers user={user}>{children}</Providers>
</body>
</html>
);
}
4. 이미지·폰트·prefetch 최적화
- <Image> 기본 lazy-load + WebP/AVIF 최적화 + priority로 LCP 이미지 우선 로딩
- next/font 로컬 CSS 사용으로 FOUT 최소화, <Link prefetch />를 통한 사용자 예측 경로 선로딩
- 외부 script는 next/script로 lazyOnload/afterInteractive 등 로딩 전략 지정
import Image from 'next/image';
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'], preload: true });
export default function Page() {
return (
<main className={inter.className}>
<Image src="/hero.jpg" width={1200} height={600} priority alt="hero"/>
<Link href="/blog" prefetch>블로그 보기</Link>
</main>
);
}
5. 측정과 개선 루프
- Web Vitals, Lighthouse, React Profiler, Vercel Analytics 활용해 FCP, LCP, TTI, CLS 등 핵심 지표 분석
- 번들 크기 확인은 @next/bundle-analyzer로 시각화, 대형 dependency 정리
6. App Router 최적화 체크리스트
전략 | 핵심 포인트 |
서버 우선 아키텍처 | Server Component 기본, Client 최소화 |
코드 분할 | next/dynamic, React.lazy, 외부 모듈 import() |
데이터 패칭 | layout에서 공통 fetch, 캐싱 활용 |
미디어 최적화 | <Image>, <Link prefetch>, next/font, <Script> 전략 |
모니터링 | Vitals + Profiler + Analytics + Bundle Analyzer |
7. 실전 팁
- 초기 번들경량화: 불필요한 polyfill, 무거운 UI library lazy-loading 경량화.
- 지능형 hydration 전략: 이미지나 중요도 낮은 컴포넌트는 Intersection Observer 기반 lazy hydration 최적화.
- 선제 prefetch: hover, viewport 진입, 주요 link에 prefetch 적용해 UX 개선을 통한 체감 속도 향상.
위 내용을 처리한다면 실제 체감 속도나 Google Core Web Vitals 점수에서 현격한 개선을 느낄 수 있을 것입니다.
반응형