์๋ ํ์ธ์! ๐ ์ค๋์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ๊ฐ์ฅ ์ฌ๋๋ฐ๋ ๋ ๊ฐ์ง ๋๊ตฌ, TypeScript์ Tailwind CSS๋ฅผ ํจ๊ป ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด ์กฐํฉ์ ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ณ , ๊ฐ๋ฐ ์๋๋ฅผ ํฅ์์ํค๋ ํ์์ ์ธ ์๋์ง๋ฅผ ๋ฐํํฉ๋๋ค.
๐ค ์ TypeScript์ Tailwind CSS๋ฅผ ํจ๊ป ์ฌ์ฉํ ๊น์?
๋ ๋๊ตฌ์ ์กฐํฉ์ด ์ ๊ฐ๋ ฅํ์ง ๊ฐ๋จํ ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
- TypeScript (TS): JavaScript์ ์ ์ ํ์ ์ ์ถ๊ฐํ ์ธ์ด์ ๋๋ค. ์ปดํ์ผ ๋จ๊ณ์์ ์ค๋ฅ๋ฅผ ๋ฏธ๋ฆฌ ์ก์๋ผ ์ ์์ด ์ฝ๋์ ์์ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. ์๋ ์์ฑ ๊ธฐ๋ฅ๋ ๊ฐ๋ ฅํด์ ธ ๊ฐ๋ฐ ๊ฒฝํ์ด ์ฆ๊ฑฐ์์ง๋๋ค. ๐ค
- Tailwind CSS: ์ ํธ๋ฆฌํฐ ์ฐ์ (Utility-First) CSS ํ๋ ์์ํฌ๋ก, ๋ฏธ๋ฆฌ ์ ์๋ ํด๋์ค๋ฅผ HTML์ ์ง์ ์ ์ฉํ์ฌ ๋น ๋ฅด๊ณ ์ผ๊ด๋ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. CSS ํ์ผ์ ๋ค์ ์ผ ํ์ ์์ด ๋งํฌ์ ๋ด์์ ์คํ์ผ๋ง์ ์์ฑํ ์ ์์ฃ . ๐จ
์ด ๋์ ํจ๊ป ์ฌ์ฉํ๋ฉด, ํ์ ์ ์์ ์ฑ๊ณผ ๋น ๋ฅธ ์คํ์ผ๋ง์ด๋ผ๋ ๋ ๋ง๋ฆฌ ํ ๋ผ๋ฅผ ๋ชจ๋ ์ก์ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ํ๋ ์์ํฌ(React, Vue, Svelte ๋ฑ)์ ํจ๊ป๋ผ๋ฉด ๊ทธ ํจ๊ณผ๋ ๋ฐฐ๊ฐ ๋ฉ๋๋ค.
๐ ๏ธ ํ๋ก์ ํธ ์ค์ ์์ํ๊ธฐ (feat. Next.js)
๊ฐ์ฅ ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ ์ค ํ๋์ธ Next.js๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ ๊ณผ์ ์ ์๋ดํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. Next.js ํ๋ก์ ํธ ์์ฑ
๋จผ์ , TypeScript๊ฐ ํฌํจ๋ ์๋ก์ด Next.js ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. ํฐ๋ฏธ๋์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ธ์.
npx create-next-app@latest my-ts-tailwind-app --typescript
์ค์น ๊ณผ์ ์์ ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ๋์ฌ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ์ค์ ์ ์ ํํ๊ณ ์งํํ๋ฉด my-ts-tailwind-app์ด๋ผ๋ ์ด๋ฆ์ ํ๋ก์ ํธ ํด๋๊ฐ ์์ฑ๋ฉ๋๋ค.
2. Tailwind CSS ์ค์น ๋ฐ ์ค์ ํ์ผ ์์ฑ
ํ๋ก์ ํธ ํด๋๋ก ์ด๋ํ ํ, Tailwind CSS์ ๊ด๋ จ ์์กด์ฑ ํจํค์ง(postcss, autoprefixer)๋ฅผ ์ค์นํฉ๋๋ค.
cd my-ts-tailwind-app
npm install -D tailwindcss postcss autoprefixer
์ด์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ Tailwind CSS ์ค์ ํ์ผ์ ์์ฑํฉ๋๋ค.
npx tailwindcss init -p
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด tailwind.config.ts (๋๋ .js)์ postcss.config.js ํ์ผ์ด ํ๋ก์ ํธ ๋ฃจํธ์ ์์ฑ๋ฉ๋๋ค.
3. Tailwind CSS ๊ฒฝ๋ก ์ค์
tailwind.config.ts ํ์ผ์ ์ด๊ณ , Tailwind๊ฐ ์คํ์ผ์ ์ ์ฉํ ํ์ผ๋ค์ ๊ฒฝ๋ก๋ฅผ content ๋ฐฐ์ด์ ์ถ๊ฐํด ์ค๋๋ค. ์ด๋ ๊ฒ ํด์ผ ํ๋ก๋์ ๋น๋ ์ ์ฌ์ฉ๋์ง ์๋ ์คํ์ผ์ด ์ ๊ฑฐ(Purge)๋์ด CSS ํ์ผ ํฌ๊ธฐ๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
backgroundImage: {
"gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
"gradient-conic":
"conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
},
},
},
plugins: [],
};
export default config;
4. ์ ์ญ CSS์ Tailwind ์ง์์ด ์ถ๊ฐ
src/app/globals.css (๋๋ styles/globals.css) ํ์ผ์ ์ด์ด ๊ธฐ์กด ๋ด์ฉ์ ๋ชจ๋ ์ง์ฐ๊ณ , Tailwind CSS์ ๊ธฐ๋ณธ ์ง์์ด(directives)๋ฅผ ์ถ๊ฐํฉ๋๋ค.
@tailwind base;
@tailwind components;
@tailwind utilities;
- @tailwind base: ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ์คํ์ผ์ ์ด๊ธฐํํ๊ณ Tailwind์ ๊ธฐ๋ณธ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค.
- @tailwind components: Tailwind์ ์ปดํฌ๋ํธ ํด๋์ค๋ฅผ ์ฃผ์ ํฉ๋๋ค.
- @tailwind utilities: Tailwind์ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์ฃผ์ ํฉ๋๋ค.
5. ๊ฐ๋ฐ ์๋ฒ ์คํ ๋ฐ ํ์ธ
์ด์ ๋ชจ๋ ์ค์ ์ด ๋๋ฌ์ต๋๋ค! ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ์ฌ Tailwind CSS๊ฐ ์ ์ ์ฉ๋๋์ง ํ์ธํด ๋ด ์๋ค.
npm run dev
src/app/page.tsx ํ์ผ์ ์ด๊ณ , ๋ค์๊ณผ ๊ฐ์ด Tailwind ํด๋์ค๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ ์คํ์ผ์ ์ ์ฉํด ๋ณด์ธ์.
export default function Home() {
return (
<main className="flex min-h-screen flex-col items-center justify-center p-24 bg-gray-100">
<h1 className="text-4xl font-bold text-blue-600 animate-pulse">
๐ TS + Tailwind CSS ์ค์ ์๋ฃ! ๐
</h1>
<p className="mt-4 text-lg text-gray-700">
์ด์ ๋ฉ์ง ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์! โจ
</p>
</main>
);
}
๋ธ๋ผ์ฐ์ ์์ "TS + Tailwind CSS ์ค์ ์๋ฃ!"๋ผ๋ ํ๋์ ํ ์คํธ๊ฐ ๊น๋นก์ด๋ฉฐ ๋ณด์ธ๋ค๋ฉด ์ฑ๊ณต์ ๋๋ค! ๐
๐ก ์์๋๋ฉด ์ข์ ํ
- ํด๋์ค ์์ ์๋ ์ ๋ ฌ: prettier-plugin-tailwindcss ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ฉด ํด๋์ค ์์๋ฅผ ์๋์ผ๋ก ์ ๋ ฌํด์ฃผ์ด ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค.
- ์ปดํฌ๋ํธ ์ถ์ํ: ๋ฐ๋ณต๋๋ ์ ํธ๋ฆฌํฐ ํด๋์ค ์กฐํฉ์ ๋ณ๋์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด ์ฌ์ฌ์ฉ์ฑ์ ๋์ด์ธ์.
- @apply ์ฌ์ฉ ์ต์ํ: ๊ฐ๊ธ์ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. @apply๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ ํ์ ์ผ๋ก ์ฌ์ฉํด์ผ ์ ์ง๋ณด์์ฑ์ด ๋จ์ด์ง๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค.
- VS Code ํ์ฅ ํ๋ก๊ทธ๋จ: Tailwind CSS IntelliSense ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ค์นํ๋ฉด ํด๋์ค ์ด๋ฆ ์๋ ์์ฑ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฑ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ด ๊ฐ๋ฐ ํจ์จ์ด ๊ทน๋ํ๋ฉ๋๋ค.