๐Ÿ“– TIL - CSS ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๊ธฐ: Next.js์™€ Tailwind๋กœ ์Šคํƒ€์ผ๋ง ์ฒœ๊ตญ์œผ๋กœ

์Š˜ยท2025๋…„ 3์›” 21์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
76/90

๐Ÿ”„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ: ์›นํŽ˜์ด์ง€ ๋‚ด์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰
  • Node.js ํ™˜๊ฒฝ: ์„œ๋ฒ„ ์ธก์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰

Next.js๋Š” ์ด ๋‘ ํ™˜๊ฒฝ์„ ๋ชจ๋‘ ํ™œ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๐Ÿ–ผ๏ธ Next.js Image ์ปดํฌ๋„ŒํŠธ

Image ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?

Next.js์—์„œ ์ œ๊ณตํ•˜๋Š” Image ์ปดํฌ๋„ŒํŠธ๋Š” ์ผ๋ฐ˜ HTML์˜
<img>ํƒœ๊ทธ๋ณด๋‹ค ๋งŽ์€ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ!

๐Ÿ“ height์™€ width ์†์„ฑ์ด ํ•„์š”ํ•œ ์ด์œ 

Image์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด height์™€ width๊ฐ’์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ height์™€ width๊ฐ’์„ ํ•„์ˆ˜๋กœ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜์˜€์„๊นŒ?

1. ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

Next.js๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์•Œ์•„์•ผ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ •ํ™•ํ•œ width์™€ height๋ฅผ ์ง€์ •ํ•˜๋ฉด Next.js์˜ ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์—”์ง„์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฐ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ํฌ๊ธฐ์— ๋งž๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ๋ ˆ์ด์•„์›ƒ ์‰ฌํ”„ํŠธ ๋ฐฉ์ง€(CLS)

์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ ๋˜๊ธฐ ์ „์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉด, ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ์— ํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋ ๋•Œ ๋‹ค๋ฅธ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐ€๋ ค๋‚˜๋Š” ๋ ˆ์ด์•„์›ƒ ์‰ฌํ”„ํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ UX๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ Core Web Vitalsdml CLS(Cumulative Layout Shift) ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์š”์†Œ์ด๋‹ค.

๐Ÿš€ ์ถ”๊ฐ€์ ์ธ Image ์ปดํฌ๋„ŒํŠธ์˜ ์žฅ์ 

1. ์ง€์—ฐ๋กœ๋”ฉ(Lazy Loading)

์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ์ด๋ฏธ์ง€๋“ค์„ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , viewport(ํ™”๋ฉด์— ๋ณด์ด๋Š” ์˜์—ญ)์— ๊ฐ€๊นŒ์›Œ์งˆ๋•Œ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•œ๋‹ค. ์ด๋Š” ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„๊ณผ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์—ฌ์ค€๋‹ค.

2. CDN ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜

Next.js Image์ปดํฌ๋„ŒํŠธ๋Š” CDN ์บ์‹ฑ ์›๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. ํŠนํžˆ Vercel์— ๋ฐฐํฌํ•  ๊ฒฝ์šฐ, Vercel์˜ ๊ธ€๋กœ๋ฒŒ ์—ฃ์ง€ ๋„คํŠธ์›Œํฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”๋œ ์ด๋ฏธ์ง€๋ฅผ ์บ์‹ฑํ•˜๊ณ  ๋ฐฐํฌํ•œ๋‹ค. ์ฒซ ์š”์ฒญ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์›๋ณธ ์†Œ์Šค์—์„œ ๊ฐ€์ ธ์™€ ์บ์‹œ์— ์ €์žฅํ•˜๊ณ  ์ดํ›„ ์š”์ฒญ ์‹œ์—๋Š” ์บ์‹œ์—์„œ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ป Image ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ ์˜ˆ์‹œ

import Image from 'next/image';

function MyComponent() {
  return (
    <Image
      src="/my-image.jpg"
      width={500}
      height={300}
      alt="์ด๋ฏธ์ง€ ์„ค๋ช…"
      // priority ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ฆ‰์‹œ ๋กœ๋“œ(์ง€์—ฐ ๋กœ๋”ฉ ๋น„ํ™œ์„ฑํ™”)
      // priority
    />
  );
}

๊ทธ๋Ÿผ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ Image ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

  • Image ์ปดํฌ๋„ŒํŠธ๋Š” ๋งŽ์€ ์ด์ ์ด ์žˆ์–ด ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋‚˜, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค.

๐ŸŽจ Next.js์™€ Tailwind CSS์˜ ๊ด€๊ณ„

๐ŸŒŸ Next.js๊ฐ€ Tailwind CSS๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ 

1. ์œ ํ‹ธ๋ฆฌํ‹ฐ ์šฐ์„ (Utility-first) ์ ‘๊ทผ ๋ฐฉ์‹:

Tailwind CSS๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด HTML ๋‚ด์—์„œ ์ง์ ‘ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ ์‹œํ‚จ๋‹ค. ๋ณ„๋„์˜ CSS ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

2. ์„ฑ๋Šฅ ์ตœ์ ํ™”:

ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์Šคํƒ€์ผ์„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•˜์—ฌ ์ตœ์ข… CSS ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™” ํ•œ๋‹ค.

3. ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ:

tailwind.config.js ํŒŒ์ผ์„ ํ†ตํ•ด ํ…Œ๋งˆ, ์ƒ‰์ƒ, ๊ฐ„๊ฒฉ๋“ฑ์„ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์ผ๊ด€๋œ UI๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์‰ฝ๋‹ค.

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        primary: '#3490dc',
        secondary: '#ffed4a',
        accent: '#f56565',
      }
    }
  }
}

4. ์‰ฌ์šด ํ†ตํ•ฉ

Next.js๋Š” Tailwind CSS ์„ค์ •์„ ์œ„ํ•œ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๊ฐ„๋‹จํžˆ ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด ์„ค์ •์ด ์™„๋ฃŒ๋œ๋‹ค.

npx create-next-app --tailwind

5. ๋™์ผ ํšŒ์‚ฌ์˜ ์ง€์›

๋‘ ๊ธฐ์ˆ  ๋ชจ๋‘ Vercel์ด๋ผ๋Š” ํšŒ์‚ฌ๊ฐ€ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ๊ณผ ์ง€์†์ ์ธ ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค. Vercel์€ Next.js๋ฅผ ๋งŒ๋“  ํšŒ์‚ฌ์ด๋ฉฐ, Tailwind CSS์˜ ๊ฐœ๋ฐœ๋„ ์ ๊ทน ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿ“ ์š”์•ฝ

  • Next.js์˜ Image ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฏธ์ง€ ์ตœ์ ํ™”, ๋ ˆ์ด์•„์›ƒ ์‰ฌํ”„ํŠธ ๋ฐฉ์ง€, ์ง€์—ฐ ๋กœ๋”ฉ, CDN ์บ์‹ฑ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์›น ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
  • Image ์ปดํฌ๋„ŒํŠธ์˜ width์™€ height ์†์„ฑ์€ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”์™€ ๋ ˆ์ด์•„์›ƒ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ด๋‹ค.
  • Next.js๋Š” ๊ฐœ๋ฐœ ์†๋„, ์„ฑ๋Šฅ ์ตœ์ ํ™”, ์ผ๊ด€๋œ ๋””์ž์ธ, ์‰ฌ์šด ํ†ตํ•ฉ ๋“ฑ์˜ ์ด์œ ๋กœ Tailwind CSS๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.
  • ๋‘ ๊ธฐ์ˆ  ๋ชจ๋‘ Vercel์˜ ์ง€์›์„ ๋ฐ›๊ณ  ์žˆ์–ด ์ง€์†์ ์ธ ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.
profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

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