๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Next

Next.js Image ์•Œ์•„๋ณด๊ธฐ

Next.js์—์„œ๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค

 

Next.js๋ฅผ ์“ฐ์ง€ ์•Š์•˜์„ ๋•Œ๋Š” Lazy loading๋“ฑ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๊ณ ๋ คํ•ด์•ผํ•  ์‚ฌํ•ญ์ด ๋งŽ์•˜๋Š”๋ฐ Next.js์—์„œ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต์„ ํ•ด์ค€๋‹ค๊ณ ํ•œ๋‹ค.

ํ•œ๋ฒˆ ์‚ดํŽด๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•ด๋ณด์ž 

 

 

Image ์ปดํฌ๋„ŒํŠธ์— ๋‚ด์žฅ๋œ ์ตœ์ ํ™”๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

  • ํ–ฅ์ƒ๋œ ์„ฑ๋Šฅ - ์ตœ์‹  ์ด๋ฏธ์ง€ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฐ ๋””๋ฐ”์ด์Šค์— ๋งž๋Š” ์˜ฌ๋ฐ”๋ฅธ ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค
  • ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ - ์ž๋™์œผ๋กœ CLS (Cumulative Layout Shift) ๋ฅผ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค
  • ๋น ๋ฅธ ํŽ˜์ด์ง€ ๋กœ๋“œ - ์ด๋ฏธ์ง€๊ฐ€ ๋ทฐํฌํŠธ์— ๋“ค์–ด ์™”์„ ๋•Œ๋งŒ ๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค
  • ์œ ์—ฐํ•œ ์—์…‹ - ์™ธ๋ถ€์— ์ €์žฅ๋œ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ์—๋„ ํฌ๊ธฐ ์กฐ์ •์ด ๊ฐ€๋Šฅ

ํ•„์ˆ˜ props

src

  1. ์ •์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€ ํŒŒ์ผ
  2. ์™ธ๋ถ€ URL ( ์™ธ๋ถ€ url์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ next.config.js์— remotePatterns ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ์•ผ ํ•œ๋‹ค )

width, height

์ •์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€ ๋˜๋Š” layout="fill" ์ธ ์ด๋ฏธ์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ  width , height์†์„ฑ์ด ํ•„์š”ํ•˜๋‹ค

 

 

์˜ต์…”๋„ Props

layout

intrinsic (default) - ๊ธฐ๋ณธ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์•„์งˆ ๊ฒฝ์šฐ ๋ถ€๋ชจ ์ปจํ…Œ์ด๋„ˆ ๋„ˆ๋น„์— ๋งž๊ฒŒ ์ถ•์†Œ๋œ๋‹ค

fixed - ํ™”๋ฉด ํฌ๊ธฐ์™€ ์ƒ๊ด€์—†์ด ์ง€์ •๋œ width, height๋ฅผ ์œ ์ง€ํ•œ๋‹ค

responsive - ๋ถ€๋ชจ๊ฐ€ display: block ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋ถ€๋ชจ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌ๊ธฐ์— ๋งž์ถฐ์ง„๋‹ค (์ด๋ฏธ์ง€์˜ ๋น„์œจ์€ ์œ ์ง€)

fill - ๋ถ€๋ชจ๊ฐ€ display: relative ์ผ ๊ฒฝ์šฐ ๋ถ€๋ชจ์˜ width, height์™€ ๋™์ผํ•˜๊ฒŒ ๋งž์ถฐ์ง„๋‹ค. ์ฃผ๋กœ objectFit๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ

 

loader

URL์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜

src, width, quality๋ฅผ props๋กœ ๋ฐ›์•„ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ URL ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

import Image from 'next/image'

const myLoader = ({ src, width, quality }) => {
  return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}

const MyImage = (props) => {
  return (
    <Image
      loader={myLoader}
      src="me.png"
      alt="Picture of the author"
      width={500}
      height={500}
    />
  )
}

 

 

quality

1๋ถ€ํ„ฐ 100 ์‚ฌ์ด์˜ ํ€„๋ฆฌํ‹ฐ(default 75)๋ฅผ ์ง€์ •ํ•˜๊ณ  ์ˆซ์ž๊ฐ€ ๋†’์„์ˆ˜๋ก ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๋†’๋‹ค๋Š” ์˜๋ฏธ

 

priority

true์ธ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๊ฐ€ ๋†’์€ ์šฐ์„  ์ˆœ์œ„์™€ preload๋กœ ๊ฐ„์ฃผ๋œ๋‹ค

LCP(Large Contentful Paint) ์š”์†Œ๊ฐ€ ๋  ์ด๋ฏธ์ง€์— priority์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ํŽ˜์ด์ง€ ์ƒ๋‹จ์— ์Šคํฌ๋กค ์—†์ด ๋ณผ ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์—๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ 'false'์ด๋‹ค

 

placeholder

์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋ณด์—ฌ์งˆ placeholder์ด๋‹ค. ์Šค์ผˆ๋ ˆํ†ค UI์™€ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค

์ง€์ • ๊ฐ€๋Šฅํ•œ ์†์„ฑ์€ blur, empty ์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 'empty'์ด๋‹ค

'blur'์†์„ฑ์ธ ๊ฒฝ์šฐ blurDataURL์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ •์ , ๋™์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€์—ฌ์•ผ ํ•˜๋ฉฐ, 10px์ดํ•˜์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค

'empty'์†์„ฑ์ธ ๊ฒฝ์šฐ์—๋Š” ๋นˆ ๊ณต๊ฐ„๋งŒ ๋ณด์—ฌ์ค€๋‹ค.

 

loading

Next.js์—์„œ ์ด๋ฏธ์ง€์˜ ๊ธฐ๋ณธ ๋กœ๋“œ ๋ฐฉ์‹์€ LazyLoading์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ ‘lazy’์ด๋‹ค

lazy์ธ ๊ฒฝ์šฐ์— ๋ทฐํฌํŠธ์— ๊ณ„์‚ฐ๋œ ๊ฑฐ๋ฆฌ์— ๋„๋‹ฌ ํ•  ๋•Œ๊นŒ์ง€ ๋กœ๋“œ๋ฅผ ์—ฐ๊ธฐํ•œ๋‹ค

๋ฐ˜๋Œ€๋กœ ‘eager’ ์†์„ฑ์ธ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ฆ‰์‹œ ๋กœ๋“œํ•œ๋‹ค

 

reference

https://nextjs.org/docs/api-reference/next/image

'Next' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Next.js์˜ Pre-rendering  (1) 2022.09.11
Next.js์˜ _app๊ณผ _document ์•Œ์•„๋ณด๊ธฐ  (0) 2022.09.05
Next.js ์•Œ์•„๋ณด๊ธฐ  (1) 2022.08.31