๐ŸŽจ Tailwind CSS, ์™œ ์ด๋ ‡๊ฒŒ ํŽธํ•˜์ง€?

์ž”๋‚˜๋น„ยท2025๋…„ 9์›” 1์ผ

jannabee๋กœ๊ทธ

๋ชฉ๋ก ๋ณด๊ธฐ
10/14

Firebase Authentication UI๋ฅผ ๋งŒ๋“ค๋ฉด์„œ, CSS๋Š” Tailwind CSS
๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Tailwind CSS๊ฐ€ ๋ญ”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ์“ฐ๋ฉด ํŽธํ•œ์ง€ ์ง์ ‘ ๋А๋‚€ ๊ฒฝํ—˜์„ ๊ธฐ๋กํ•ด๋‘”๋‹ค.


Tailwind CSS๋ž€?

  • Tailwind CSS = โ€œ๋””์ž์ธ์šฉ ๋ ˆ๊ณ  ๋ธ”๋กโ€
  • ๊ธฐ์กด ๋ฐฉ์‹: CSS ํŒŒ์ผ์— .button { color: red; } ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง์ ‘ ์Šคํƒ€์ผ ์ •์˜
  • Tailwind ๋ฐฉ์‹: HTML ํƒœ๊ทธ ์•ˆ์— ๋ฐ”๋กœ class="bg-red-500 text-white p-4 rounded" ์ฒ˜๋Ÿผ ํด๋ž˜์Šค ์ด๋ฆ„๋งŒ ๋ถ™์—ฌ์„œ ์Šคํƒ€์ผ ์™„์„ฑ

๐Ÿ‘‰ ์ฆ‰, ๋ฏธ๋ฆฌ ์ค€๋น„๋œ โ€œ์Šคํƒ€์ผ ์กฐ๊ฐโ€๋“ค์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์กฐ๋ฆฝํ•˜๋Š” ๋А๋‚Œ์ด๋‹ค.


์ผ๋ฐ˜ CSS VS Tailwind CSS ์˜ˆ์‹œ ๋น„๊ต

<!-- ์ผ๋ฐ˜ CSS -->
<button class="btn">ํšŒ์›๊ฐ€์ž…</button>

<style>
  .btn {
    background: blue;
    color: white;
    padding: 8px 16px;
    border-radius: 8px;
  }
</style>
<!-- Tailwind CSS -->
<button class="bg-blue-500 text-white px-4 py-2 rounded-lg">
  ํšŒ์›๊ฐ€์ž…
</button>

โœ… ์ฐจ์ด์ : CSS ๋”ฐ๋กœ ์•ˆ ์“ฐ๊ณ , HTML ํด๋ž˜์Šค๋งŒ์œผ๋กœ ๋ฐ”๋กœ ์Šคํƒ€์ผ๋ง ๊ฐ€๋Šฅ!


Tailwind CSS ์žฅ์ 

1. ๋น ๋ฅด๋‹ค

  • CSS ์ƒˆ ํŒŒ์ผ ์—ด๊ณ , ํด๋ž˜์Šค๋ช… ๊ณ ๋ฏผํ•  ํ•„์š” ์—†์Œ

  • ๊ทธ๋ƒฅ ํ•„์š”ํ•œ ์Šคํƒ€์ผ์„ class ์•ˆ์— ์ ์œผ๋ฉด ๋

2. ์ผ๊ด€์„ฑ ์œ ์ง€

  • ํŒ€์—์„œ ์“ฐ๋ฉด, ๋‹ค๋“ค ๊ฐ™์€ ์ƒ‰์ƒ/์—ฌ๋ฐฑ ๋‹จ์œ„๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋จ

  • text-gray-600, p-4, rounded-lg ๊ฐ™์€ ํ‘œ์ค€ํ™”๋œ ๊ทœ์น™

3. ๋ฐ˜์‘ํ˜•๋„ ์†์‰ฝ๊ฒŒ

<div class="w-full sm:w-1/2 lg:w-1/3">๋‚ด์šฉ</div>

โ†’ ํ™”๋ฉด ํฌ๊ธฐ๋ณ„๋กœ ์ž๋™ ์Šคํƒ€์ผ ์ ์šฉ (sm, md, lg ๊ฐ™์€ prefix ์‚ฌ์šฉ)


๋ฐ˜์‘ํ˜• ํ”„๋ฆฌํ”ฝ์Šค(sm:, md:, lg: โ€ฆ)๊ฐ€ ๋ญ”๋ฐ?

Tailwind๋Š” ๋ชจ๋ฐ”์ผ ์šฐ์„ (Mobile-first) ์ด๋ผ์„œ, ๊ธฐ๋ณธ ํด๋ž˜์Šค๋Š” ์ž‘์€ ํ™”๋ฉด์— ์ ์šฉ๋˜๊ณ ,
sm:, md:, lg: ๊ฐ™์€ ํ”„๋ฆฌํ”ฝ์Šค(prefix) ๋ฅผ ๋ถ™์ด๋ฉด ๊ทธ ๋„ˆ๋น„ ์ด์ƒ์—์„œ ๋ฎ์–ด์จ์„œ ์ ์šฉ๋œ๋‹ค.

๊ธฐ๋ณธ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ(๊ธฐ๋ณธ๊ฐ’)

์ ‘๋‘์‚ฌ์˜๋ฏธ(์ตœ์†Œ ๋„ˆ๋น„)
sm:โ‰ฅ 640px
md:โ‰ฅ 768px
lg:โ‰ฅ 1024px
xl:โ‰ฅ 1280px
2xl:โ‰ฅ 1536px

โœ… ํ•ด์„: lg:w-1/3 โ†’ ํ™”๋ฉด์ด 1024px ์ด์ƒ์ผ ๋•Œ ๋„ˆ๋น„๋ฅผ 1/3๋กœ.


์˜ˆ์ œ ํ•ด๋ถ€

<div class="w-full sm:w-1/2 lg:w-1/3">๋‚ด์šฉ</div>
  • ๊ธฐ๋ณธ(๋ชจ๋ฐ”์ผ, < 640px): w-full โ†’ ๊ฐ€๋กœ 100%
  • ํƒœ๋ธ”๋ฆฟ(โ‰ฅ 640px): sm:w-1/2 โ†’ ๊ฐ€๋กœ 1/2 (2์—ด ๋ ˆ์ด์•„์›ƒ์ฒ˜๋Ÿผ ๋ณด์ž„)
  • ๋ฐ์Šคํฌํƒ‘(โ‰ฅ 1024px): lg:w-1/3 โ†’ ๊ฐ€๋กœ 1/3 (3์—ด ๋ ˆ์ด์•„์›ƒ)

์ฆ‰, ํ™”๋ฉด์ด ์ปค์งˆ์ˆ˜๋ก ๋” ๊ตฌ์ฒด์ ์ธ ๊ทœ์น™์ด ๋‹ค์Œ ๊ทœ์น™์„ ๋ฎ์–ด์“ด๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.


์ž์ฃผ์“ฐ๋Š” ํด๋ž˜์Šค ์ •๋ฆฌ

๋ ˆ์ด์•„์›ƒ/๋””์Šคํ”Œ๋ ˆ์ด

๋ถ„๋ฅ˜ํด๋ž˜์Šค์˜๋ฏธ
์ปจํ…Œ์ด๋„ˆ ํญcontainer, max-w-sm/md/lg/xl/2xl, w-full, w-1/2, w-1/3, w-96์ตœ๋Œ€/๊ณ ์ •/๋ถ„์ˆ˜ ๋„ˆ๋น„
๋””์Šคํ”Œ๋ ˆ์ดblock, inline-block, inline, flex, grid, hiddenํ‘œ์‹œ ๋ฐฉ์‹
๋ฐฉํ–ฅ/์ •๋ ฌflex-row, flex-col, items-center, justify-between, gap-4ํ”Œ๋ ‰์Šค ์ •๋ ฌ/๊ฐ„๊ฒฉ
๊ทธ๋ฆฌ๋“œgrid-cols-1/2/3, sm:grid-cols-2, gap-4๊ทธ๋ฆฌ๋“œ ์—ด/๊ฐ„๊ฒฉ

๊ฐ„๊ฒฉ(Spacing)

๋ถ„๋ฅ˜ํด๋ž˜์Šค์˜๋ฏธ
๋งˆ์ง„m-4, mx-4, my-2, mt-6๋ฐ”๊นฅ ์—ฌ๋ฐฑ
ํŒจ๋”ฉp-4, px-4, py-2, pt-6์•ˆ์ชฝ ์—ฌ๋ฐฑ
์š”์†Œ๊ฐ„ ๊ฐ„๊ฒฉspace-x-4, space-y-2ํ˜•์ œ ์‚ฌ์ด ๊ฐ„๊ฒฉ(์ˆ˜์ง/์ˆ˜ํ‰)

ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ

๋ถ„๋ฅ˜ํด๋ž˜์Šค์˜๋ฏธ
ํฌ๊ธฐtext-xs/sm/base/lg/xl/2xl/โ€ฆ๊ธ€์ž ํฌ๊ธฐ
๋‘๊ป˜font-light/normal/medium/semibold/boldํฐํŠธ ๋‘๊ป˜
์ƒ‰์ƒtext-gray-600, text-blue-600, text-red-500๊ธ€์ž ์ƒ‰
์ •๋ ฌtext-left/center/right์ •๋ ฌ

๋ฐฐ๊ฒฝ/ํ…Œ๋‘๋ฆฌ/๋ชจ์„œ๋ฆฌ/๊ทธ๋ฆผ์ž

๋ถ„๋ฅ˜ํด๋ž˜์Šค์˜๋ฏธ
๋ฐฐ๊ฒฝ์ƒ‰bg-white, bg-gray-100, bg-blue-600๋ฐฐ๊ฒฝ ์ƒ‰
ํ…Œ๋‘๋ฆฌborder, border-0/2, border-gray-300๋ณด๋” ๋‘๊ป˜/์ƒ‰
๋ชจ์„œ๋ฆฌrounded, rounded-md/lg/full๋‘ฅ๊ทผ ์ •๋„
๊ทธ๋ฆผ์žshadow, shadow-md/lg๊ทธ๋ฆผ์ž ๊ฐ•๋„

์ƒํƒœ(hover/focus/disabled ๋“ฑ)

๋ถ„๋ฅ˜ํด๋ž˜์Šค์˜ˆ์‹œ
ํ˜ธ๋ฒ„hover:bg-blue-700, hover:underline๋งˆ์šฐ์Šค ์˜ค๋ฒ„
ํฌ์ปค์Šคfocus:outline-none, focus:ring-2, focus:ring-blue-500, focus:ring-offset-2ํฌ์ปค์Šค ์Šคํƒ€์ผ
๋น„ํ™œ์„ฑdisabled:opacity-50, disabled:cursor-not-allowed๋น„ํ™œ์„ฑ ์ƒํƒœ

์œ„์น˜/๊ธฐํƒ€

๋ถ„๋ฅ˜ํด๋ž˜์Šค์˜๋ฏธ
์œ„์น˜relative, absolute, fixed, inset-0, top-0, left-1/2ํฌ์ง€์…”๋‹
์˜ค๋ฒ„ํ”Œ๋กœ์šฐoverflow-hidden/auto๋„˜์นจ ์ฒ˜๋ฆฌ
์ปค์„œcursor-pointer/not-allowed์ปค์„œ
์ „ํ™˜transition, duration-200, ease-in-outํŠธ๋žœ์ง€์…˜

์‹ค์ œ ์‚ฌ์šฉ ์‹œ ๋А๋‚€ ์ (Firebase ์ธ์ฆ ํŽ˜์ด์ง€์— ์ ์šฉํ•ด๋ณด๋‹ˆโ€ฆ)

  • ๋กœ๊ทธ์ธ ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ, bg-white shadow-lg rounded-lg p-6๋งŒ ๋ถ™์—ฌ๋„ ๋ฐ”๋กœ ์˜ˆ์œ ์นด๋“œ ์™„์„ฑ
  • ๋ฒ„ํŠผ๋„ bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg๋งŒ ์“ฐ๋ฉด ์ฆ‰์‹œ ํ˜„๋Œ€์ ์ธ ๋А๋‚Œ

๐Ÿ‘‰ ๋””์ž์ธ ๊ฐ๊ฐ ์—†์–ด๋„ ๊น”๋”ํ•œ UI๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐Ÿ“ ์ด๋ฒˆ์— ๋ฐฐ์šด ์ 

  • Tailwind CSS๋Š” โ€œ๋””์ž์ธ ์ดˆ๋ณด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ ์‚ฌ์ „โ€ ๊ฐ™์€ ์กด์žฌ๋‹ค.

  • Utility-first ๊ฐœ๋… ์ดํ•ด: Tailwind๋Š” โ€œ์ž‘์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์กฐํ•ฉโ€์œผ๋กœ ์Šคํƒ€์ผ๋งํ•œ๋‹ค๋Š” ์ฒ ํ•™.

  • ๋ชจ๋“ˆ์„ฑ: ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ์žฌ์‚ฌ์šฉํ•  ๋•Œ๋„, ๋ณ„๋„ CSS ์ˆ˜์ • ์—†์ด ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ .

  • CSS๋ฅผ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋‹ˆ, ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ํ™•์‹คํžˆ ๋นจ๋ผ์ง„๋‹ค.

  • ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ๊นŒ์ง€ ํด๋ž˜์Šค ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Firebase ๊ฐ™์€ MVP ๊ฐœ๋ฐœ์—์„œ๋Š” Tailwind๊ฐ€ ํŠนํžˆ ๋น›์„ ๋ฐœํ•œ๋‹ค โœจ

profile
โ€œ๋ธŒ๋žœ๋“œ๋ฅผ ์ž‡๊ณ , ๊ฐ์„ฑ์„ ์„ค๊ณ„ํ•˜๋ฉฐ, ๊ธฐ๋Šฅ์„ ์‹คํ˜„ํ•˜๋Š” ์—ฐ๊ฒฐ์žโ€๋กœ ์„ฑ์žฅํ•˜๊ณ ํ”ˆ^.^

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