๐Ÿ–ผ๏ธ 10. ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์ •๋ฆฌ - Lazy Loading๊ณผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ์‹œ์ž‘

JM_Devยท2025๋…„ 4์›” 24์ผ
1
post-thumbnail

์›นํŽ˜์ด์ง€๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ์ง„์งœ ๋งŽ๋‹ค.
ํŠนํžˆ ๋ฐ˜์‘ํ˜• ์›น, ์ธ๋„ค์ผ ๋ฆฌ์ŠคํŠธ, ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ๋“ฑ์—์„œ๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ํ•œ ๋ฒˆ์— ๋กœ๋”ฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋Š” ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„์™€ UX์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ค€๋‹ค.


โœ… Lazy Loading์ด๋ž€?

์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค๋กœ ํ•ด๋‹น ์œ„์น˜์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹

<img src="thumbnail.jpg" loading="lazy" alt="์ธ๋„ค์ผ" />

์žฅ์ 

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ 
  • ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ
  • Core Web Vitals ์ค‘ LCP ๊ฐœ์„  ํšจ๊ณผ

โœ… IntersectionObserver๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

loading="lazy"๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด์ง€๋งŒ,
๋” ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค๋ฉด IntersectionObserver๋ฅผ ์“ฐ๋ฉด ์ข‹๋‹ค.

useEffect(() => {
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        entry.target.src = entry.target.dataset.src;
      }
    });
  });

  const imgs = document.querySelectorAll('img[data-src]');
  imgs.forEach(img => observer.observe(img));
}, []);

โœ… Next.js์—์„œ์˜ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

Next.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ next/image ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

import Image from 'next/image';

<Image
  src="/thumbnail.jpg"
  alt="์ธ๋„ค์ผ"
  width={400}
  height={300}
  priority={false}
  loading="lazy"
/>

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ž๋™ ์••์ถ• ๋ฐ ํฌ๋งท ๋ณ€ํ™˜ (WebP)
  • Lazy Loading ๊ธฐ๋ณธ ๋‚ด์žฅ
  • blurDataURL๋กœ ํ”„๋ฆฌ๋กœ๋”ฉ ํšจ๊ณผ ๊ฐ€๋Šฅ

โœ… ์‹ค๋ฌด ํŒ - ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์ „๋žต๋“ค

  • CDN ์‚ฌ์šฉ (์˜ˆ: Cloudflare, AWS S3 + CloudFront)
  • ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ค„์ด๊ธฐ (TinyPNG, Squoosh ๋“ฑ)
  • WebP, AVIF ํฌ๋งท ์‚ฌ์šฉ
  • <picture> ํƒœ๊ทธ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋ณ„ ํฌ๋งท ์ตœ์ ํ™” ์ œ๊ณต
<picture>
  <source srcset="image.webp" type="image/webp" />
  <source srcset="image.jpg" type="image/jpeg" />
  <img src="image.jpg" alt="์ด๋ฏธ์ง€ ์„ค๋ช…" />
</picture>

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

๊ฐœ๋ฐœํ•  ๋•Œ๋Š” โ€œ์ด๋ฏธ์ง€ ๋„ฃ๋Š” ๊ฑฐ ์–ด๋ ต์ง€ ์•Š์ง€โ€๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ,
๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ, ๋А๋ฆฐ ๋„คํŠธ์›Œํฌ, SEO๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ๋‹จ์ˆœํ•œ img ํ•˜๋‚˜์—๋„ ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฑธ ๋А๊ผˆ๋‹ค.
ํŠนํžˆ next/image๋ฅผ ์“ฐ๋ฉด์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ตœ์ ํ™”๊ฐ€ ์ž๋™์œผ๋กœ ๋˜๋Š”์ง€ ๋ณด๊ณ  ๊ฐํƒ„ํ•จ...


๐Ÿ“ท โ€œ์ด๋ฏธ์ง€๋Š” ๋ณด์ด๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ, ํŽ˜์ด์ง€ ์†๋„์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฒฐ์ •์ง“๋Š”๋‹ค.โ€

profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€