Pink Bobblehead Bunny ๐Ÿš€ TypeScript์™€ Tailwind CSS๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•
 

๐Ÿš€ TypeScript์™€ Tailwind CSS๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•

์•ˆ๋…•ํ•˜์„ธ์š”! ๐Ÿ‘‹ ์˜ค๋Š˜์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ๊ฐ€์žฅ ์‚ฌ๋ž‘๋ฐ›๋Š” ๋‘ ๊ฐ€์ง€ ๋„๊ตฌ, 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 ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„ ์ž๋™ ์™„์„ฑ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋“ฑ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ํšจ์œจ์ด ๊ทน๋Œ€ํ™”๋ฉ๋‹ˆ๋‹ค.