ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿš€ Next.js์—์„œ Lazy Loading ๊ตฌํ˜„ ๊ฐ€์ด๋“œ

Next.js๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ, ์ด๋ฏธ์ง€, ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์„ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฐ€์ด๋“œ๋Š” App Router ํ™˜๊ฒฝ์—์„œ Lazy Loading์„ ์ ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


โœ… 1. next/dynamic์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ Lazy Loading

Next.js์˜ next/dynamic ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

'use client';
import dynamic from 'next/dynamic';

const LazyComponent = dynamic(() => import('./components/LazyComponent'), {
  loading: () => <p>๋กœ๋”ฉ ์ค‘...</p>,
  ssr: false, // ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋น„ํ™œ์„ฑํ™”
});

export default function Page() {
  return (
    <div>
      <h1>๋ฉ”์ธ ํŽ˜์ด์ง€</h1>
      <LazyComponent />
    </div>
  );
}

์˜ต์…˜ ์„ค๋ช…

loading ๋กœ๋”ฉ ์ค‘ ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ
ssr: false ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ๋กœ๋”ฉํ•˜๋„๋ก ์„ค์ •

โœ… 2. React.lazy + Suspense

React์˜ ๊ณต์‹ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Suspense๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ ์ค‘ UI๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

'use client';
import { lazy, Suspense } from 'react';

const LazyComponent = lazy(() => import('./components/LazyComponent'));

export default function Page() {
  return (
    <Suspense fallback={<p>๋กœ๋”ฉ ์ค‘...</p>}>
      <LazyComponent />
    </Suspense>
  );
}

App Router์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ next/dynamic์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.


โœ… 3. ์ด๋ฏธ์ง€ Lazy Loading

๋ฐ˜์‘ํ˜•

Next.js์˜ next/image ์ปดํฌ๋„ŒํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Lazy Loading์ด ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

import Image from 'next/image';

export default function Page() {
  return (
    <Image
      src="/images/banner.jpg"
      alt="Banner"
      width={800}
      height={500}
    />
  );
}

์ค‘์š”ํ•œ ์ด๋ฏธ์ง€์—๋Š” priority ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฆ‰์‹œ ๋กœ๋”ฉ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<Image src="/hero.jpg" alt="Hero" width={1200} height={700} priority />

โœ… 4. Intersection Observer ๊ธฐ๋ฐ˜ Lazy Loading

๋ธŒ๋ผ์šฐ์ €์˜ IntersectionObserver API๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ทฐํฌํŠธ์— ๋“ค์–ด์™”์„ ๋•Œ๋งŒ ๋กœ๋”ฉํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

'use client';
import { useEffect, useRef, useState } from 'react';
import dynamic from 'next/dynamic';

const LazyComponent = dynamic(() => import('./components/LazyComponent'), { ssr: false });

export default function Page() {
  const ref = useRef(null);
  const [show, setShow] = useState(false);

  useEffect(() => {
    const observer = new IntersectionObserver(([entry]) => {
      if (entry.isIntersecting) {
        setShow(true);
        observer.disconnect();
      }
    });

    if (ref.current) {
      observer.observe(ref.current);
    }

    return () => observer.disconnect();
  }, []);

  return (
    <div>
      <h1>Intersection Observer ์˜ˆ์ œ</h1>
      <div ref={ref}>{show && <LazyComponent />}</div>
    </div>
  );
}

โœ… 5. ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ Lazy Loading

Next.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ, ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋งŒ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

import Link from 'next/link';

<Link href="/about">About ํŽ˜์ด์ง€ ์ด๋™</Link>

๊ธฐ๋Šฅ ์„ค๋ช…

๊ธฐ๋ณธ prefetch ํŽ˜์ด์ง€ ์ง„์ž… ์ „์— ์ฝ”๋“œ ๋ฏธ๋ฆฌ ๋กœ๋”ฉ๋จ
๋น„ํ™œ์„ฑํ™” <Link prefetch={false} />

โœ… 6. ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ Lazy Loading

next/script ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import Script from 'next/script';

strategy ์„ค๋ช…

beforeInteractive Next.js ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ๋กœ๋”ฉ
afterInteractive ๊ธฐ๋ณธ๊ฐ’, ๋ Œ๋” ์ดํ›„ ๋กœ๋”ฉ
lazyOnload ๋ธŒ๋ผ์šฐ์ € ์œ ํœด ์ƒํƒœ์—์„œ ๋กœ๋”ฉ

โœ… ์š”์•ฝ

ํ•ญ๋ชฉ ์ ์šฉ ๋ฐฉ๋ฒ•

์ปดํฌ๋„ŒํŠธ Lazy Loading next/dynamic, React.lazy + Suspense
์ด๋ฏธ์ง€ Lazy Loading next/image (๊ธฐ๋ณธ ์ ์šฉ๋จ)
Intersection Observer ํ™œ์šฉ ํŠน์ • ๋ทฐํฌํŠธ ์ง„์ž… ์‹œ ๋กœ๋”ฉ
๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ Lazy Loading ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ
์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ Lazy Loading next/script์˜ strategy ์†์„ฑ ์‚ฌ์šฉ

 

Next.js, Lazy Loading, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ํผํฌ๋จผ์Šค ์ตœ์ ํ™”, ์ด๋ฏธ์ง€ ์ตœ์ ํ™”, React Suspense, next/dynamic, Intersection Observer, Script Lazy Load, SEO ์ตœ์ ํ™”, App Router

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•