์ด ํ์ด์ผ
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>
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 ํ์ผ์ ์ ์งํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋๋ค.
Tailwind 3.0๋ถํฐ๋ Just-In-Time
๋ชจ๋๊ฐ ๊ธฐ๋ณธ์ผ๋ก ํ์ฑํ๋์ด, ์ค์๊ฐ์ผ๋ก ํ์ํ CSS ํด๋์ค๋ง ์์ฑํ๊ณ ๋ถํ์ํ ์ฝ๋๋ ๋น๋์ ํฌํจํ์ง ์์ต๋๋ค. Purge๋ฅผ ํตํด CSS ์ต์ ํ๋ฅผ ์งํํ๋ ๊ฒ์ด JIT๋ก ๋์ฒด๊ฐ ๋ ๊ฒ์ธ๋ฐ์, Purge๊ฐ ๋ชจ๋ ์คํ์ผ์ ๋น๋์ ํฌํจ์ํค๊ณ , ๊ทธ ์ค ์ฌ์ฉ๋์ง ์๋ CSS๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ์์ด๋ผ๋ฉด JIT๋ ์ ์ด์ ๋น๋ ์ค ํ์ํ CSS๋ง์ ์ค์๊ฐ์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ก ์ธํด ๋น ๋ฅธ ๋น๋ ์๋์ ์์ CSS ํ์ผ ํฌ๊ธฐ๊ฐ ๊ฐ๋ฅํด์ง๋ฉฐ, CSS ํ์ผ ํฌ๊ธฐ๊ฐ 10kB ์ดํ๋ก ์ ์ง๋ ์ ์์ต๋๋ค. ํนํ, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ค์ HTML์ ์ง์ ์ ์ฉ๋๋ฏ๋ก, ์คํ์ผ ์ฝ๋์ ์ค๋ณต์ ํผํ๊ณ ์ต์ ํ๋ ํํ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด JIT๋ ๋ ๋น ๋ฅธ ์๋์ ํจ์จ์ ์ธ ํ์ผ ํฌ๊ธฐ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
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์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฒฐํฉ์ ์ต์ํํ์ฌ ๋ ๊ฐ๋ฒผ์ด ๋ฒ๋ค์ ์ ์งํ ์ ์์ต๋๋ค.