๐ŸŒŠ Tailwind CSS๋ฅผ ARABOZA

zizonyoungjunยท2024๋…„ 10์›” 12์ผ
2
post-custom-banner


์–ด ํ˜•์ด์•ผ

Tailwind (Atomic CSS)

Tailwind CSS๋Š” 2017๋…„์— ๋“ฑ์žฅํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํผ์ŠคํŠธ(Utility-First) ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, CSS ์Šคํƒ€์ผ์„ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, HTML์—์„œ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ ์ •์˜์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™ ์—†์ด ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ์Šคํƒ€์ผ๋ง์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์กฐํ•ฉํ•ด ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Tailwind๋Š” ํŠนํžˆ Atomic CSS ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ, ์†Œ๊ทœ๋ชจ์˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

Atomic CSS๋Š” ์›น์‚ฌ์ดํŠธ์˜ ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ๋‹จ์œ„์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด ์Šคํƒ€์ผ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋””์ž์ธ ์š”์†Œ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CSS ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด, HTML ๋‚ด์—์„œ ์ง์ ‘ ์ ์šฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Tailwind์—์„œ๋Š” bg-blue-500, py-2, px-4 ๊ฐ™์€ ํด๋ž˜์Šค๋“ค์ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ์Šคํƒ€์ผ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ž‘์€ ์Šคํƒ€์ผ ๋‹จ์œ„๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋””์ž์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<button class="bg-blue-500 text-white py-2 px-4 rounded">
  Click Me
</button>

Atomic CSS์˜ ํ•ต์‹ฌ ์žฅ์  - ์„ฑ๋Šฅ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ

Tailwind์˜ Atomic CSS ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ CSS ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ์Šคํƒ€์ผ๋ง ๋ฐฉ๋ฒ•์—์„œ๋Š” ์ž‘์„ฑ๋œ ์Šคํƒ€์ผ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ์‹œํ‚ค์ง€๋งŒ, Tailwind๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” CSS๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” Purge ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ตœ์ข… ๋นŒ๋“œ๋œ CSS ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋นŒ๋“œ ์‹œ์ ์— ๋ฐœ์ƒํ•˜๋ฉฐ, JS์˜ Tree Shaking๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. Purge ๊ธฐ๋Šฅ์€ ํ”„๋กœ์ ํŠธ์— ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋œ ํด๋ž˜์Šค๋งŒ ํฌํ•จ์‹œ์ผœ ๋ถˆํ•„์š”ํ•œ ์Šคํƒ€์ผ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ตœ์ข… CSS ํŒŒ์ผ์ด ๋งค์šฐ ์ž‘๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

/* Tailwind ๋นŒ๋“œ ๊ฒฐ๊ณผ */
.p-8 {
  padding: 2rem;
}

.bg-blue-500 {
  background-color: #4299e1;
}

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

Just-In-Time ๋ชจ๋“œ (JIT)

Tailwind 3.0๋ถ€ํ„ฐ๋Š” Just-In-Time ๋ชจ๋“œ๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด, ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•„์š”ํ•œ CSS ํด๋ž˜์Šค๋งŒ ์ƒ์„ฑํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋Š” ๋นŒ๋“œ์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Purge๋ฅผ ํ†ตํ•ด CSS ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ๊ฒƒ์ด JIT๋กœ ๋Œ€์ฒด๊ฐ€ ๋œ ๊ฒƒ์ธ๋ฐ์š”, Purge๊ฐ€ ๋ชจ๋“  ์Šคํƒ€์ผ์„ ๋นŒ๋“œ์— ํฌํ•จ์‹œํ‚ค๊ณ , ๊ทธ ์ค‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” CSS๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด JIT๋Š” ์• ์ดˆ์— ๋นŒ๋“œ ์ค‘ ํ•„์š”ํ•œ CSS๋งŒ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„์™€ ์ž‘์€ CSS ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ, CSS ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ 10kB ์ดํ•˜๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋“ค์€ HTML์— ์ง์ ‘ ์ ์šฉ๋˜๋ฏ€๋กœ, ์Šคํƒ€์ผ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ์ตœ์ ํ™”๋œ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด JIT๋Š” ๋” ๋น ๋ฅธ ์†๋„์™€ ํšจ์œจ์ ์ธ ํŒŒ์ผ ํฌ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Tailwind์˜ ๋‹จ์  - ๊ฐ€๋…์„ฑ ๋ฌธ์ œ

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

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„ํŠผ ์ฝ”๋“œ์—์„œ ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ์„ ํ•œ๊บผ๋ฒˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํด๋ž˜์Šค ์†์„ฑ์ด ๊ธธ์–ด์ง€๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

<button class="bg-blue-500 text-white py-2 px-4 rounded-lg hover:bg-blue-700 transition duration-300">
  Click Me
</button>

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


๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ 

Tailwind๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ๊ณผ ์ƒ์‚ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋“ค์ด ์ž‘๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ฐ™์€ ์Šคํƒ€์ผ์„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต ์ž‘์—…์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, PurgeCSS์™€ JIT ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด CSS ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ๋ฉด์—์„œ๋„ ํƒ์›”ํ•ฉ๋‹ˆ๋‹ค.

CSS-in-JS์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์Šคํƒ€์ผ๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ์—๋„, Tailwind๋Š” ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ์ ๊ณ  ๋นŒ๋“œ ์‹œ์ ์— ์ตœ์ ํ™”๋œ CSS ํŒŒ์ผ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. CSS-in-JS๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ์Šคํƒ€์ผ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์ง€๋งŒ, Tailwind๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ๋น ๋ฅด๊ฒŒ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Tailwind๋Š” ์Šคํƒ€์ผ์„ ์ปดํฌ๋„ŒํŠธ์™€ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— CSS์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฐํ•ฉ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋” ๊ฐ€๋ฒผ์šด ๋ฒˆ๋“ค์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

post-custom-banner

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