ํฌํธํด๋ฆฌ์ค๋ฅผ ๋ง๋ค๋ฉฐ, ์ปดํฌ๋ํธ ๋ถ๋ฆฌ๋ฅผ ํ๋ ค๋ค 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๊ฐ์ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋ฐํ์์ ์์ฑ๋๋ฏ๋ก ๋น๋ ์์ ์ ์ธ์์ด ๋ถ๊ฐ๋ฅ ํ๋ค. ๊ด๋ จํ์ฌ ๊ณต์๋ฌธ์๋ฅผ ์ดํด๋ณด๋ ์ญ์ ์น์ ํ๊ฒ ๊ธฐ์ ๋์ด ์์๋ค.
์ฌ์ค ๋น๋ ์์ ๊ณผ ๋ฐํ์, ์๋ฏธ์ ์ผ๋ก๋ ์์ง๋ง.. ํ๋ฒ ๋ ์ง๊ณ ๊ฐ๋ณด๋ ค ํ๋ค..
๋ด๊ฐ ์ด ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๊ฒ ๋ฐ๊ฟ์ฃผ๋ ๊ณผ์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์ฆ, ์ฌ๋์ด ์ฐ๋ ์ธ์ด โ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๊ฒ!
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ง์ด ์ฐ๋ ์ปดํ์ผ๋ฌ๋ก๋ Babel, Webpack, Vite ๊ฐ์ ๊ฒ ์๋๋ฐ..
์๋ฅผ ๋ค์ด Babel์ ์ต์ JS ๋ฌธ๋ฒ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ์ธ ์ ์๊ฒ ๋ฐ๊ฟ์ค์, ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ ์ ์๋ค.
์ปดํ์ผ๋ ์ฝ๋์๋ค๊ฐ ์ด๋ฏธ์ง, ํฐํธ, ์ค์ ํ์ผ ๊ฐ์ ๋ฆฌ์์ค๊น์ง ์น ๋ค ๋ฌถ์ด์ ํ๋๋ก ํจํค์งํ๋ ๊ณผ์ ์ ๋น๋๋ผ๊ณ ํ๋ค.
์ฝ๊ฒ ๋งํด์ ์คํ ๊ฐ๋ฅํ ์์ฑ๋ณธ์ ๋ง๋๋ ๊ฒ์ ๋ปํ๊ณ
Java์์๋ .jar, .war ๊ฐ์ ํ์ผ, ์๋์ฐ์์๋ .exe ๊ฐ์ ๊ฑธ๋ก ๋์ค๊ธฐ๋ ํ๊ณ ,
ํ๋ก ํธ์์๋ ์ต์ ํ๋ HTML/CSS/JS ํ์ผ์ ๋ง๋ค์ด์ ๋ฐฐํฌํ ์ค๋น๋ฅผ ๋๋ด๋ ๊ฑฐ๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ก ์คํ๋๋ ์๊ฐ!
์๋ฅผ ๋ค์ด ์น์ฌ์ดํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์ด์์ ๋, ๊ทธ ์์ ๋ถํฐ๊ฐ ๋ฐํ์์ด๋ผ๊ณ ๋ณผ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด โ๋ฐํ์ ์๋ฌโ๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด ๊ทธ ์ด์ ์ด๋ค.
์ ๋ฆฌํ์๋ฉด..!!
Tailwind: ์ ์ ๋ถ์ โ "๋น๋ ์์ "์ ํด๋์ค๋ช ํ์
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด: ๋์ ์ผ๋ก โ "๋ฐํ์ ์์ "์ ๋ฌธ์์ด ๊ฒฐ์ ๋จ
Tailwind๋ ์์ค ํ์ผ์ ์ผ๋ฐ ํ ์คํธ๋ก ์ค์บํ๋ฏ๋ก ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฌธ์์ด ์ฐ๊ฒฐ์ด๋ ๋ณด๊ฐ์ ์ดํดํ ์ ์์ต๋๋ค.
<div class="text-{{ error ? 'red' : 'green' }}-600"></div>
<div class="{{ error ? 'text-red-600' : 'text-green-600' }}"></div>
๋ถ๋๋ฝ๊ฒ๋ ๋ด๊ฐ ์ฌ์ฉํ๋ ค ํ๋ ๋ฐฉ๋ฒ์ด ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ๊ณต์๋ฌธ์์ ๊ธฐ์ ๋์ด ์์์๋ค..;;
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์ ๋๊ธฐ๋ฉด ํ์ ์คํฌ๋ฆฝํธ์์ ๋ฏธ๋ฆฌ ์ก์์ค๋ค!
https://tailwindcss.com/docs/detecting-classes-in-source-files
https://v2.tailwindcss.com/docs/just-in-time-mode