• Posts
  • Works
  • Etc
github

์ด๋ฏธ์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๊ฒฌ๋”œ ์ˆ˜ ์—†์–ด์„œ

blurDataURL๋ฅผ ํ†ตํ•œ Next.js ์ด๋ฏธ์ง€ ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌ

2022-11-21

๐Ÿซ  ๊นœ๋นก์ด๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๊ฑฐ์Šฌ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ

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

๐Ÿ“ƒ Next.js์˜ Image ์ปดํฌ๋„ŒํŠธ

๋ธ”๋กœ๊ทธ์— ์“ฐ์ธ ์ด๋ฏธ์ง€๋Š” ๊ธฐ์กด html ํƒœ๊ทธ์ธ <img>๊ฐ€ ์•„๋‹Œ Next.js์˜ ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ์ธ <Image>๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ  ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

  • ์„ฑ๋Šฅ ํ–ฅ์ƒ : ๋ชจ๋˜ ์ด๋ฏธ์ง€ ํฌ๋งท์„ ์‚ฌ์šฉํ•ด ๊ฐ ๋””๋ฐ”์ด์Šค์— ๋งž๋Š” ์‚ฌ์ด์ฆˆ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ํ™”๋ฉด ์•ˆ์ •์„ฑ : ๋ ˆ์ด์•„์›ƒ ์‰ฌํ”„ํŠธ๋ฅผ ์ž๋™ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • ๋น ๋ฅธ ํŽ˜์ด์ง€ ๋กœ๋“œ : ์œ ์ €๊ฐ€ ๋ทฐํฌํŠธ์— ์ง„์ž…ํ•  ๋•Œ๋งŒ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋œ๋‹ค.
  • ์—์…‹ ์œ ์—ฐ์„ฑ: ๋ฆฌ๋ชจํŠธ ์„œ๋ฒ„์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋„ ์˜จ๋””๋งจ๋“œ๋กœ ๋ฆฌ์‚ฌ์ด์ง•ํ•œ๋‹ค. (์ถœ์ฒ˜ : Next.js ๊ณต์‹ ๋ฌธ์„œ)

Image ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์ด๋ฏธ์ง€ ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ Props๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค.

<Image
  src="/me.png"
  alt="Picture of the author"
  width={500} // ๋ ˆ์ด์•„์›ƒ ์‰ฌํ”„ํŠธ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค
  height={500} // ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ํฌ๊ธฐ์— ๋งž์ถ”๊ณ  ์‹ถ์„ ๋•Œ๋Š”, fill์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค
/>

๊ธฐ์กด์—๋Š” ํ•„์ˆ˜์ ์ธ Props์ธ width์™€ height๋งŒ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค๊ฐ€, ์ด๋ฏธ์ง€ ๋กœ๋“œ ์‹œ placeholder ์„ธํŒ…์„ ์œ„ํ•ด placeholder์™€ blurDataURL Props๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

โ˜๏ธ placeholder & blurDataURL

Image ์ปดํฌ๋„ŒํŠธ์˜ placeholder๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ ๋  ๋™์•ˆ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ผ ์š”์†Œ๋ฅผ ์„ค์ •ํ•˜๋Š” Props๋‹ค. ๊ธฐ๋ณธ ์„ธํŒ…์€ empty๊ณ , ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” blur๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

<Image
	src="/me.png"
	alt="Picture of the author"
	width={500} // ๋ ˆ์ด์•„์›ƒ ์‰ฌํ”„ํŠธ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค
	height={500} // ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ํฌ๊ธฐ์— ๋งž์ถ”๊ณ  ์‹ถ์„ ๋•Œ๋Š”, fill์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค
	placeholder="blur"
	blurDataURL={blurDataURL} //base64๋กœ ์ธ์ฝ”๋”ฉ ๋œ ์ด๋ฏธ์ง€ ์†Œ์Šค
/>

blur๋กœ ์„ค์ •ํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ blurDataURL์ด๋ผ๋Š” Props๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๊ณ , ๋ฐ”๋กœ ์—ฌ๊ธฐ์— base64 ํ˜•์‹์˜ ์ด๋ฏธ์ง€ ์†Œ์Šค๋ฅผ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ ๋  ๋™์•ˆ ๋ธ”๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ›  base64 ํ˜•์‹์˜ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

Next.js ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ์œ„ blurDataURL์— ๋“ค์–ด๊ฐˆ ์ด๋ฏธ์ง€ ์†Œ์Šค ์ƒ์„ฑ์„ ์œ„ํ•ด plaiceholder๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.

import { getPlaiceholder } from "plaiceholder";

const { base64 } = await getPlaiceholder("/path-to-your-image.jpg");

plaiceholder ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋ถ€ํ„ฐ getPlaiceholder๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์„ ์–ป์–ด์˜ค๋ฉด ๋œ๋‹ค.

์ด ๋ธ”๋กœ๊ทธ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, getStaticProps ์•ˆ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ํŽ˜์ด์ง€์— Props๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋“ค์ด ๋กœ๋“œ ๋˜๋Š” ๋™์•ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ธ”๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋๋‹ค :)