๐Ÿ–ผ๏ธ 06. ์ด๋ฏธ์ง€ & ๋ฏธ๋””์–ด ์ตœ์ ํ™”: ์˜์ˆ˜ ๋‹˜, ๋กœ๋”ฉ์ด ์™œ ์ด๋ ‡๊ฒŒ ๋А๋ ค์š”?

2026๋…„ 3์›” 5์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

img alt, srcset/sizes, picture ์•„ํŠธ ๋””๋ ‰์…˜, lazy loading, Next.js Image ์ปดํฌ๋„ŒํŠธ โ€” ์ด๋ฏธ์ง€๊ฐ€ ์„ฑ๋Šฅ์„ ์ขŒ์šฐํ•˜๋Š” ์ด์œ ๋ฅผ ํŒŒํ—ค์นฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 18๋ถ„ / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 10๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„

[img์˜ ํ•„์ˆ˜ ์†์„ฑ] โ†’ [srcset/sizes ๋ฐ˜์‘ํ˜• ์ด๋ฏธ์ง€] โ†’ [picture ์•„ํŠธ ๋””๋ ‰์…˜] โ†’ [lazy loading] โ†’ [Next.js Image]

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • alt ์†์„ฑ์˜ ์ƒํ™ฉ๋ณ„ ์˜ฌ๋ฐ”๋ฅธ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • srcset + sizes ๋กœ ํ•ด์ƒ๋„๋ณ„ ์ตœ์  ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • <picture> ๋กœ ์•„ํŠธ ๋””๋ ‰์…˜ (๋ชจ๋ฐ”์ผ/๋ฐ์Šคํฌํƒ‘ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€) ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Next.js <Image> ๊ฐ€ <img> ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "์˜ํ˜ธ ๋‹˜, ๋ชจ๋ฐ”์ผ์—์„œ ์ธ๋„ค์ผ์ด ์—„์ฒญ ๋А๋ฆฌ๊ฒŒ ๋กœ๋“œ๋ผ์š”. ๋ณด๋‹ˆ๊นŒ ๋ฐ์Šคํฌํƒ‘์šฉ 4000px ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๋ชจ๋ฐ”์ผ์—๋„ ์“ฐ๊ณ  ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฑฐ ๊ฐ™์•„์š”. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ด์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์ด๋ฏธ์ง€๊ฐ€ ์›น ์„ฑ๋Šฅ์˜ 30~40%๋ฅผ ์ขŒ์šฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”. ์ง€๊ธˆ ๋ชจ๋ฐ”์ผ์—์„œ 4000px์งœ๋ฆฌ 5MB ์ด๋ฏธ์ง€๋ฅผ 150px๋กœ ์ถ•์†Œํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฑด 5MB ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋ ˆ๊ธฐํ†ต์— ๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์˜ˆ์š”. srcset ์œผ๋กœ ๊ธฐ๊ธฐ์— ๋งž๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ฃผ๊ณ , loading='lazy' ๋กœ ๋ทฐํฌํŠธ ๋ฐ– ์ด๋ฏธ์ง€ ๋กœ๋“œ๋ฅผ ๋ฏธ๋ค„์•ผ ํ•ด์š”."

๐Ÿ–ผ๏ธ 1. img ํ•„์ˆ˜ ์†์„ฑ

<!-- โœ… 5๋…„ ์ฐจ์˜ img ๊ธฐ๋ณธ ๊ตฌ์กฐ -->
<img
  src="/images/profile.jpg"         <!-- ํด๋ฐฑ URL (srcset ๋ฏธ์ง€์› ๋ธŒ๋ผ์šฐ์ €์šฉ) -->
  alt="์˜์ฒ  ๋‹˜์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„"           <!-- ์ ‘๊ทผ์„ฑ + SEO ํ•ต์‹ฌ -->
  width="400"                        <!-- ๋ช…์‹œ ํ•„์ˆ˜: Layout Shift ๋ฐฉ์ง€ -->
  height="400"                       <!-- ๋ช…์‹œ ํ•„์ˆ˜: Layout Shift ๋ฐฉ์ง€ -->
  loading="lazy"                     <!-- ๋ทฐํฌํŠธ ๋ฐ– ์ด๋ฏธ์ง€ ์ง€์—ฐ ๋กœ๋“œ -->
/>

alt ์†์„ฑ ์ž‘์„ฑ ๊ทœ์น™:

์ƒํ™ฉalt ์ž‘์„ฑ๋ฒ•
์˜๋ฏธ ์žˆ๋Š” ์ด๋ฏธ์ง€์ด๋ฏธ์ง€ ๋‚ด์šฉ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช… (alt="์˜์ฒ  ๋‹˜์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„")
์žฅ์‹์šฉ ์ด๋ฏธ์ง€๋นˆ ๋ฌธ์ž์—ด (alt="") โ€” ์Šคํฌ๋ฆฐ๋ฆฌ๋”๊ฐ€ ๊ฑด๋„ˆ๋œ€
์•„์ด์ฝ˜ + ํ…์ŠคํŠธ ํ•จ๊ป˜alt="" โ€” ์˜† ํ…์ŠคํŠธ๊ฐ€ ์„ค๋ช…ํ•˜๋ฏ€๋กœ ์ค‘๋ณต ๋ฐฉ์ง€
์ฐจํŠธ/๊ทธ๋ž˜ํ”„๋ฐ์ดํ„ฐ ์š”์•ฝ ์„ค๋ช… (alt="2024๋…„ Q4 ๋งค์ถœ: 1.2์–ต")

width + height ๋ฅผ ๋ช…์‹œํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฏธ์ง€ ๋กœ๋“œ ์ „ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•ด Cumulative Layout Shift(CLS) ๋ฅผ ๋ฐฉ์ง€ํ•ด. LCP/CLS๋Š” Core Web Vitals ์ง€ํ‘œ์ด์ž SEO ๋žญํ‚น ์š”์†Œ์•ผ.


๐Ÿ“ 2. srcset + sizes โ€” ํ•ด์ƒ๋„ ์ „ํ™˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์— 4000px ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฑด 5MB๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. srcset ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์—ฌ๋Ÿฌ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์•Œ์•„์„œ ์„ ํƒํ•˜๊ฒŒ ํ•ด.

<!-- srcset + sizes: ๋ทฐํฌํŠธ ๋„ˆ๋น„์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ด๋ฏธ์ง€ ์„ ํƒ -->
<img
  srcset="
    images/hero-480w.jpg  480w,
    images/hero-800w.jpg  800w,
    images/hero-1200w.jpg 1200w
  "
  sizes="
    (max-width: 600px) 480px,
    (max-width: 1024px) 800px,
    1200px
  "
  src="images/hero-1200w.jpg"
  alt="์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€"
  width="1200"
  height="600"
/>

๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฏธ์ง€ ์„ ํƒ ๊ณผ์ •:

  1. ํ˜„์žฌ ๋ทฐํฌํŠธ ๋„ˆ๋น„ ํ™•์ธ (์˜ˆ: 480px)
  2. sizes ์—์„œ ์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด ์ฐพ๊ธฐ โ†’ 480px ์Šฌ๋กฏ
  3. srcset ์—์„œ 480w ์ด๋ฏธ์ง€ ์„ ํƒ โ†’ hero-480w.jpg ๋กœ๋“œ

๐ŸŽจ 3. picture ์š”์†Œ โ€” ์•„ํŠธ ๋””๋ ‰์…˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์„ธ๋กœ ๋น„์œจ์˜ ํด๋กœ์ฆˆ์—…, ๋ฐ์Šคํฌํƒ‘์—์„œ๋Š” ์™€์ด๋“œ ํ’๊ฒฝ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๊ตฌ๋„์˜ ์ด๋ฏธ์ง€๊ฐ€ ํ•„์š”ํ•  ๋•Œ <picture> ๋ฅผ ์จ.

<!-- picture: ๋ฏธ๋””์–ด ์กฐ๊ฑด์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€ ์ œ๊ณต -->
<picture>
  <!-- ๋ชจ๋ฐ”์ผ: ์„ธ๋กœํ˜•, ์ธ๋ฌผ ํด๋กœ์ฆˆ์—… -->
  <source
    media="(max-width: 599px)"
    srcset="images/team-portrait-480w.jpg"
  />
  <!-- ํƒœ๋ธ”๋ฆฟ: ์ค‘๊ฐ„ ํฌ๊ธฐ -->
  <source
    media="(max-width: 1023px)"
    srcset="images/team-medium-800w.jpg"
  />
  <!-- ๋ฐ์Šคํฌํƒ‘: ๊ฐ€๋กœํ˜•, ํŒ€ ์ „์ฒด ์‚ฌ์ง„ -->
  <!-- ํด๋ฐฑ: srcset/picture ๋ฏธ์ง€์› ์‹œ ์ด img ํ‘œ์‹œ -->
  <img
    src="images/team-wide-1200w.jpg"
    alt="์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒ€ ์‚ฌ์ง„"
    width="1200"
    height="500"
  />
</picture>

WebP ํฌ๋งท ์ง€์› + ํด๋ฐฑ ํŒจํ„ด:

<picture>
  <!-- WebP ์ง€์› ๋ธŒ๋ผ์šฐ์ €๋Š” WebP ์‚ฌ์šฉ (ํฌ๊ธฐ 30~50% ์ ˆ์•ฝ) -->
  <source type="image/webp" srcset="image.webp" />
  <!-- WebP ๋ฏธ์ง€์› ๋ธŒ๋ผ์šฐ์ € ํด๋ฐฑ -->
  <img src="image.jpg" alt="์ด๋ฏธ์ง€ ์„ค๋ช…" width="800" height="600" />
</picture>

โณ 4. lazy loading โ€” ๋ทฐํฌํŠธ ๋ฐ– ์ด๋ฏธ์ง€ ์ง€์—ฐ ๋กœ๋“œ

<!-- loading="lazy": ๋ทฐํฌํŠธ์— ๊ฐ€๊นŒ์›Œ์งˆ ๋•Œ ๋กœ๋“œ ์‹œ์ž‘ -->
<img src="thumbnail.jpg" alt="๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ" loading="lazy" width="300" height="200" />
 
<!-- loading="eager" (๊ธฐ๋ณธ๊ฐ’): ์ฆ‰์‹œ ๋กœ๋“œ โ€” LCP ์ด๋ฏธ์ง€์— ์‚ฌ์šฉ -->
<img src="hero.jpg" alt="ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€" loading="eager" />

์–ธ์ œ lazy ์“ฐ๊ณ , ์–ธ์ œ eager ์“ฐ๋Š”๊ฐ€?

์œ„์น˜๊ถŒ์žฅ์ด์œ 
Above the fold (์ฒซ ํ™”๋ฉด) ์ด๋ฏธ์ง€, ํžˆ์–ด๋กœeager ๋˜๋Š” ์ƒ๋žต์ฆ‰์‹œ ๋ณด์—ฌ์•ผ LCP ์ ์ˆ˜ ์ข‹์Œ
์Šคํฌ๋กค ์•„๋ž˜ ์ฝ˜ํ…์ธ  ์ด๋ฏธ์ง€lazy๋ถˆํ•„์š”ํ•œ ์ดˆ๊ธฐ ๋กœ๋“œ ๋ฐฉ์ง€
๋ฌดํ•œ ์Šคํฌ๋กค ๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผlazy์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„ ํฌ๊ฒŒ ๋‹จ์ถ•

โš›๏ธ 5. Next.js Image ์ปดํฌ๋„ŒํŠธ

๐Ÿฃ ์˜์ฒ : "Next.js ์“ฐ๋ฉด <Image> ์“ฐ๋ผ๋Š”๋ฐ, ์ผ๋ฐ˜ <img> ๋ž‘ ๋ญ๊ฐ€ ๋‹ค๋ฅธ ๊ฑฐ์˜ˆ์š”?"

import Image from "next/image";
 
// โœ… Next.js Image: ์ž๋™ ์ตœ์ ํ™” ์ ์šฉ
<Image
  src="/images/profile.jpg"
  alt="์˜์ฒ  ๋‹˜์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„"
  width={400}
  height={400}
  // priority: ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€ ๋“ฑ LCP ๋Œ€์ƒ์— ์‚ฌ์šฉ (lazy=false์™€ ๋™์ผ)
  priority={false}
/>
 
// ์™ธ๋ถ€ ์ด๋ฏธ์ง€ URL (next.config.js์— ๋„๋ฉ”์ธ ํ—ˆ์šฉ ํ•„์š”)
<Image
  src="https://cdn.example.com/image.jpg"
  alt="์™ธ๋ถ€ ์ด๋ฏธ์ง€"
  fill  // ๋ถ€๋ชจ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฝ‰ ์ฑ„์›€
  style={{ objectFit: "cover" }}
/>

Next.js <Image> ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ:

๊ธฐ๋Šฅ์„ค๋ช…
์ž๋™ WebP/AVIF ๋ณ€ํ™˜๋ธŒ๋ผ์šฐ์ € ์ง€์›์— ๋”ฐ๋ผ ์ตœ์‹  ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜
์ž๋™ srcset ์ƒ์„ฑ๊ธฐ๊ธฐ ํ•ด์ƒ๋„์— ๋”ฐ๋ฅธ srcset์„ ์ž๋™ ์ƒ์„ฑ
๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ ๋ฐฉ์ง€width/height ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณต๊ฐ„ ์˜ˆ์•ฝ
lazy loading ๊ธฐ๋ณธ ์ ์šฉ๋ทฐํฌํŠธ ๋ฐ– ์ด๋ฏธ์ง€ ์ž๋™ ์ง€์—ฐ ๋กœ๋“œ
์ด๋ฏธ์ง€ ์บ์‹ฑNext.js ์„œ๋ฒ„์—์„œ ์ตœ์ ํ™”๋œ ์ด๋ฏธ์ง€ ์บ์‹ฑ


๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. ๋‹ค์Œ ์ค‘ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€์— ์ ์šฉํ•ด์•ผ ํ•  ์˜ฌ๋ฐ”๋ฅธ img ์†์„ฑ ์กฐํ•ฉ์€?

  • A) loading="lazy" + decoding="async"
  • B) loading="eager" + width + height ๋ช…์‹œ
  • ๊ฐ€) loading="lazy" + srcset ๋งŒ ์‚ฌ์šฉ
  • ๋ผ) alt="" + loading="lazy"

โœ… ์ •๋‹ต: B

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€๋Š” ์ฒซ ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” LCP ๋Œ€์ƒ ์ด๋ฏธ์ง€์˜ˆ์š”. loading="lazy" ๋ฅผ ์“ฐ๋ฉด ์˜คํžˆ๋ ค ๋กœ๋“œ๋ฅผ ๋ฏธ๋ค„ LCP ์ ์ˆ˜๊ฐ€ ๋‚˜๋น ์ ธ์š”. loading="eager" (๋˜๋Š” ์ƒ๋žต) ๋กœ ์ฆ‰์‹œ ๋กœ๋“œํ•˜๊ณ , width/height ๋ฅผ ๋ช…์‹œํ•ด ๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ(CLS)๋ฅผ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ด์š”.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€ = eager (๋˜๋Š” ์ƒ๋žต) + width/height ๋ช…์‹œ, ์Šคํฌ๋กค ์•„๋ž˜ ์ด๋ฏธ์ง€ = lazy"

Q2. Next.js์—์„œ ์™ธ๋ถ€ CDN์˜ ์ด๋ฏธ์ง€๋ฅผ <Image> ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ค ์„ค์ •์ด ํ•„์š”ํ•œ๊ฐ€?

โœ… ์ •๋‹ต: next.config.js ์˜ images.remotePatterns (๋˜๋Š” images.domains) ์— ํ—ˆ์šฉํ•  ๋„๋ฉ”์ธ์„ ๋“ฑ๋ก

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: Next.js <Image> ์˜ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์ด ์™ธ๋ถ€ ์ด๋ฏธ์ง€์—๋„ ์ ์šฉ๋˜๋ ค๋ฉด ๋ณด์•ˆ์„ ์œ„ํ•ด ํ—ˆ์šฉ ๋„๋ฉ”์ธ์„ ๋ช…์‹œํ•ด์•ผ ํ•ด์š”. ๋“ฑ๋กํ•˜์ง€ ์•Š์œผ๋ฉด ๋นŒ๋“œ/๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "์™ธ๋ถ€ ์ด๋ฏธ์ง€ = next.config.js ๋„๋ฉ”์ธ ํ—ˆ์šฉ ํ•„์ˆ˜"

Q3. ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„

์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฉ”์ธ ํŽ˜์ด์ง€์— ํŒ€ ์†Œ๊ฐœ ์„น์…˜์ด ์žˆ๋‹ค.
๋ฐ์Šคํฌํƒ‘์—์„œ๋Š” ํŒ€ ์ „์ฒด๋ฅผ ๋‹ด์€ ์™€์ด๋“œ ์‚ฌ์ง„, ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ๋Œ€ํ‘œ ์–ผ๊ตด ํด๋กœ์ฆˆ์—…์œผ๋กœ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค.
์–ด๋–ค HTML ์š”์†Œ๋ฅผ ์“ฐ๋ฉด ์ด๊ฑธ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

โœ… ์ •๋‹ต: <picture> ์š”์†Œ + <source media="..."> ์กฐํ•ฉ

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: "๋ทฐํฌํŠธ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ตฌ๋„/๊ตฌ์„ฑ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค" ๋Š” ๊ฒŒ ์•„ํŠธ ๋””๋ ‰์…˜ ๋ฌธ์ œ์˜ˆ์š”. <picture> ๋Š” media ์†์„ฑ์œผ๋กœ ์กฐ๊ฑด์„ ๊ฑธ์–ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์š”. srcset + sizes ๋Š” ๊ฐ™์€ ์ด๋ฏธ์ง€์˜ ๋‹ค๋ฅธ ํ•ด์ƒ๋„๋งŒ ์„ ํƒํ•˜๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ์—” <picture> ๊ฐ€ ๋งž์•„์š”.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "์ด๋ฏธ์ง€ ๊ตฌ๋„๊ฐ€ ๋‹ค๋ฆ„ = <picture> ์•„ํŠธ ๋””๋ ‰์…˜, ๊ฐ™์€ ์ด๋ฏธ์ง€ ๋‹ค๋ฅธ ํฌ๊ธฐ = srcset + sizes"

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜ Lighthouse ๋Œ๋ ธ๋”๋‹ˆ "Properly size images" ๊ฒฝ๊ณ ๊ฐ€ 50๊ฐœ ๋„˜๊ฒŒ ๋‚˜์™”๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ƒฅ ๋•Œ๋ ค๋ฐ•์•„์™”๋Š”๋ฐ ์ด๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋‚ญ๋น„์ธ์ง€ ์ด์ œ์•ผ ์‹ค๊ฐํ•œ๋‹ค. srcset ์ ์šฉํ•˜๊ณ  ๋‚˜์„œ ๋ชจ๋ฐ”์ผ Lighthouse ์ ์ˆ˜๊ฐ€ 42์ ์—์„œ 76์ ์œผ๋กœ ์˜ฌ๋ž๋‹ค. 34์ ์ด ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ํ•˜๋‚˜๋กœ ์˜ฌ๋ผ๊ฐ„ ๊ฑฐ๋‹ค.

๐Ÿ’ก "์ด๋ฏธ์ง€๋Š” ์›น ์„ฑ๋Šฅ์˜ ๊ฐ€์žฅ ํฐ ๋ณ€์ˆ˜๋‹ค. srcset ์œผ๋กœ ํ•ด์ƒ๋„ ์ „ํ™˜, picture ๋กœ ์•„ํŠธ ๋””๋ ‰์…˜, loading='lazy' ๋กœ ์ดˆ๊ธฐ ๋กœ๋“œ ์ตœ์†Œํ™” โ€” ์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ์ด๋‹ค."

Next.js <Image> ๊ฐ€ ์ด ๋ชจ๋“  ๊ฑธ ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค๋Š” ๊ฒŒ ์ง„์งœ ์ฒ˜์Œ์—๋Š” "๊ทธ๋ƒฅ img ์“ฐ๋ฉด ๋˜์ง€ ์™œ Image๋ฅผ ์จ์•ผ ํ•ด?" ํ–ˆ๋Š”๋ฐ, ์ด ๋ฌธ์„œ ์“ฐ๊ณ  ๋‚˜์„œ ์ด์ œ ์ดํ•ด๋๋‹ค. ์•ž์œผ๋กœ <img> ์ง์ ‘ ์“ธ ๋• ์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•œ ๋ฒˆ์”ฉ ๋Œ๋ ค๋ด์•ผ๊ฒ ๋‹ค.


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ