애드블럭 종료 후 사이트를 이용해 주세요.

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Next.js App Router(5) - 성능 최적화, 실전 팁
    Next.js 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 점수에서 현격한 개선을 느낄 수 있을 것입니다.

     

    반응형

    댓글

Designed by Tistory.