๐Ÿ”ฅ Trouble Shooting - ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“ค๋‹ค ๋งŒ๋‚œ JIT

์Š˜ยท2025๋…„ 5์›” 27์ผ

๐Ÿ”ฅ Trouble Shooting

๋ชฉ๋ก ๋ณด๊ธฐ
20/23

๐Ÿšจ ๋ฌธ์ œ ์ƒํ™ฉ

ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“ค๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ๋ฅผ ํ•˜๋ ค๋‹ค props๋กœ ๋ฐ›์€ ์ƒ‰์ƒ์„ ๋™์ ์œผ๋กœ tailwind ํด๋ž˜์Šค์— ์ ์šฉํ•˜๋ ค ํ–ˆ๋Š”๋ฐ.. ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๐Ÿ’ป ๋ฌธ์ œ ๋ฐœ์ƒ ์ฝ”๋“œ

// โŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ
const SkillTechBlock = ({ color, text }: Props) => {
  return (
    <h3 className={`text-${color}-400`}>  // ์Šคํƒ€์ผ ์ ์šฉ ์•ˆ๋จ
      {text}
    </h3>
  );
};

// ์‚ฌ์šฉ: <SkillTechBlock color="blue" text="Frontend" />

๐Ÿค” ์›์ธ ๋ถ„์„

Tailwind JIT(Just-in-time)์˜ ์ปดํŒŒ์ผ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ด์˜€๋‹ค...
์ผ๋ฐ˜์ ์œผ๋กœ Tailwind๋Š” ๋นŒ๋“œ ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•ด์„œ ์‚ฌ์šฉ๋œ ํด๋ž˜์Šค๋งŒ CSS์— ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฆ‰ text-${color}-400๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๋นŒ๋“œ ์‹œ์ ์— ์ธ์‹์ด ๋ถˆ๊ฐ€๋Šฅ ํ–ˆ๋‹ค. ๊ด€๋ จํ•˜์—ฌ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ์—ญ์‹œ ์นœ์ ˆํ•˜๊ฒŒ ๊ธฐ์ œ๋˜์–ด ์žˆ์—ˆ๋‹ค.

์‚ฌ์‹ค ๋นŒ๋“œ ์‹œ์ ๊ณผ ๋Ÿฐํƒ€์ž„, ์˜๋ฏธ์ ์œผ๋กœ๋Š” ์•Œ์ง€๋งŒ.. ํ•œ๋ฒˆ ๋” ์ง‘๊ณ  ๊ฐ€๋ณด๋ ค ํ•œ๋‹ค..

1. ์ปดํŒŒ์ผ

๋‚ด๊ฐ€ ์“ด ์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
์ฆ‰, ์‚ฌ๋žŒ์ด ์“ฐ๋Š” ์–ธ์–ด โ†’ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ!
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋งŽ์ด ์“ฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋กœ๋Š” Babel, Webpack, Vite ๊ฐ™์€ ๊ฒŒ ์žˆ๋Š”๋ฐ..
์˜ˆ๋ฅผ ๋“ค์–ด Babel์€ ์ตœ์‹  JS ๋ฌธ๋ฒ•์„ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๊ฟ”์ค˜์„œ, ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ๋นŒ๋“œ

์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์—๋‹ค๊ฐ€ ์ด๋ฏธ์ง€, ํฐํŠธ, ์„ค์ • ํŒŒ์ผ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๊นŒ์ง€ ์‹น ๋‹ค ๋ฌถ์–ด์„œ ํ•˜๋‚˜๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ณผ์ •์„ ๋นŒ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.
์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์™„์„ฑ๋ณธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋œปํ•˜๊ณ 
Java์—์„œ๋Š” .jar, .war ๊ฐ™์€ ํŒŒ์ผ, ์œˆ๋„์šฐ์—์„œ๋Š” .exe ๊ฐ™์€ ๊ฑธ๋กœ ๋‚˜์˜ค๊ธฐ๋„ ํ•˜๊ณ ,
ํ”„๋ก ํŠธ์—์„œ๋Š” ์ตœ์ ํ™”๋œ HTML/CSS/JS ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋ฐฐํฌํ•  ์ค€๋น„๋ฅผ ๋๋‚ด๋Š” ๊ฑฐ๋ผ๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

3. ๋Ÿฐํƒ€์ž„

ํ”„๋กœ๊ทธ๋žจ์ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„!
์˜ˆ๋ฅผ ๋“ค์–ด ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์—ˆ์„ ๋•Œ, ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ๊ฐ€ ๋Ÿฐํƒ€์ž„์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด โ€˜๋Ÿฐํƒ€์ž„ ์—๋Ÿฌโ€™๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ๊ทธ ์ด์œ ์ด๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด..!!
Tailwind: ์ •์  ๋ถ„์„ โ†’ "๋นŒ๋“œ ์‹œ์ "์— ํด๋ž˜์Šค๋ช… ํ•„์š”
ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด: ๋™์ ์œผ๋กœ โ†’ "๋Ÿฐํƒ€์ž„ ์‹œ์ "์— ๋ฌธ์ž์—ด ๊ฒฐ์ •๋จ

Tailwind Css ๊ณต์‹๋ฌธ์„œ

๋™์  ํด๋ž˜์Šค ์ด๋ฆ„

Tailwind๋Š” ์†Œ์Šค ํŒŒ์ผ์„ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์Šค์บ”ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์ด๋‚˜ ๋ณด๊ฐ„์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โŒ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค

<div class="text-{{ error ? 'red' : 'green' }}-600"></div>

โญ•๏ธ ํ•ญ์ƒ ์™„์ „ํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”

<div class="{{ error ? 'text-red-600' : 'text-green-600' }}"></div>

๋ถ€๋„๋Ÿฝ๊ฒŒ๋„ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ๊ณต์‹๋ฌธ์„œ์— ๊ธฐ์ œ๋˜์–ด ์žˆ์—ˆ์—ˆ๋‹ค..;;

โŒ ๋™์ ์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด props๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”

function Button({ color, children }) {
  return <button className={`bg-${color}-600 hover:bg-${color}-500 ...`}>{children}</button>;
}

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๊ณต์‹๋ฌธ์„œ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ props๋ฅผ ์ •์  ํด๋ž˜์Šค ์ด๋ฆ„์— ๋งคํ•‘ํ•˜๋„๋ก ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

const colorTextVariants = {
    cyan: 'text-cyan-400',
    green: 'text-green-400',
    purple: 'text-purple-400',
  };
...
<h3 className={`text-base font-semibold ${colorTextVariants[color]} md:text-lg`}>
	{text}
</h3>

๐ŸŽฏ ํ•ด๊ฒฐ ํฌ์ธํŠธ

๋นŒ๋“œ ์‹œ์  vs ๋Ÿฐํƒ€์ž„์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.(ํ•ต์‹ฌ)
TailWind๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค์บ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํ•œ ํด๋ž˜์Šค๋ช…์ด ์ฝ”๋“œ์— ์กด์žฌํ•ด์•ผ ํ–ˆ๋‹ค.
๋™์  ์ƒ์„ฑ๋ณด๋‹ค๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋งคํ•‘ ๋ฐฉ์‹์ด TailWind ๊ณต์‹๋ฌธ์„œ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๐Ÿ“ ๋ฐฐ์šด ์ 

๊ณต์‹๋ฌธ์„œ๋ฅผ ์ž˜ ํ™•์ธํ•˜์ž!
์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, props ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ œํ•œํ•˜๊ณ  ์ •์˜ํ•˜๋Š”๊ฒƒ์ด ์ข‹์„๋“ฏ ํ•˜๋‹ค.
๊ฐœ๋ฐœ๊ณผ์ •์—์„œ ์•„ ๊ทธ๋ƒฅ ์ด๋ ‡๊ตฌ๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ.. ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ๊ณ  ๊ทธ ๊ณผ์ •์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋‚ด๊ฐ€ ์•ž์œผ๋กœ ๊ฐ€์ ธ์•ผํ•  ๋งˆ์ธ๋“œ

๐Ÿ”„ ๊ฐœ์„ ๋œ ์ 

Before: ๋ฌด์ž‘์ • ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋™์  ํด๋ž˜์Šค ์ƒ์„ฑ ์‹œ๋„

className={`text-${color}-400`}

After: ํƒ€์ž… ์•ˆ์ „์„ฑ๊นŒ์ง€ ๊ณ ๋ คํ•œ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„

type ColorType = 'cyan' | 'green' | 'purple';
const colorTextVariants: Record<ColorType, string> = {
  cyan: 'text-cyan-400',
  green: 'text-green-400', 
  purple: 'text-purple-400',
};

์ด์ œ ์ž˜๋ชป๋œ color prop์„ ๋„˜๊ธฐ๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฏธ๋ฆฌ ์žก์•„์ค€๋‹ค!

๐Ÿ’ก ์ถ”๊ฐ€ TIP

https://tailwindcss.com/docs/detecting-classes-in-source-files
https://v2.tailwindcss.com/docs/just-in-time-mode

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

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