Published on

짜증나는 스타일링 전략 비교: CSS Module vs Tailwind vs Styled-Components

🎨 프론트엔드 스타일링 전략 비교: CSS Module vs Tailwind vs Styled-Components

세 가지 스타일링 방법과, CSS-in-JS, JS-in-CSS 정리

🔹 1. CSS Module

✅ 개요

  • 일반 CSS 파일을 모듈 단위로 불러와 컴포넌트에 국한된 스타일을 적용
  • 클래스명이 자동으로 해시 처리되어 글로벌 충돌 방지
/* Button.module.css */
.btn {
  color: white;
  background: blue;
}
import styles from './Button.module.css';

<button className={styles.btn}>Click me</button>;

✅ 장점

  • 설정이 간단하고 기존 CSS 지식 재사용 가능
  • 글로벌 클래스 충돌 없음 (scoped 처리)
  • 빌드 없이도 디버깅 쉬움 (크롬 DevTools에서 확인 쉬움)

🚫 단점

  • 조건부 스타일링이 불편
  • CSS 동적 처리나 테마 적용이 어려움
  • 로직과 스타일이 분리되어 유지보수 복잡해질 수 있음

🔹 2. Tailwind CSS

✅ 개요

  • 유틸리티 클래스 기반의 Atomic CSS 프레임워크
  • JSX 안에 직접 클래스명을 기입해 스타일 적용
<button className="rounded bg-blue-500 py-2 px-4 text-white">Click me</button>

✅ 장점

  • 빠른 개발 속도와 프로토타이핑
  • CSS 파일 작성 거의 없음
  • 디자인 시스템과 궁합 좋음
  • 모바일 반응형 (sm:, md:) 처리 간편

🚫 단점

  • HTML이 클래스명으로 지저분해 보일 수 있음
  • 커스터마이징이 초기엔 까다로움
  • 기존 CSS 유경험자에겐 진입 장벽

🔹 3. Styled-Components

✅ 개요

  • CSS-in-JS 대표 라이브러리
  • JS 안에서 CSS를 정의하고 컴포넌트 단위로 관리 가능
import styled from 'styled-components';

const Button = styled.button`
  background: blue;
  color: white;
  padding: 0.5rem 1rem;
`;

✅ 장점

  • props 기반 조건부 스타일링 매우 유연
  • 로직 + 스타일 + 테마 모두 컴포넌트 단위에서 처리 가능
  • 디자인 시스템 구성에 적합

🚫 단점

  • 런타임에 스타일이 생성되어 성능 이슈 발생 가능
  • 클래스명이 디버깅하기 어렵게 나올 수 있음
  • 번들 사이즈 증가 요인이 될 수 있음

🧠 CSS-in-JS vs JS-in-CSS?

✅ CSS-in-JS

JavaScript 코드 안에 CSS를 작성하는 방식

  • 대표: Styled-Components, Emotion, Stitches
  • 장점: 동적 스타일링, 테마 시스템, 컴포넌트 기반
  • 단점: 런타임 오버헤드, 스타일 격리 이슈

✅ JS-in-CSS

CSS에서 JS 기능(변수, 조건문 등)을 사용하는 방식
(정확히는 CSS preprocessor들이 해당)

  • 대표: SASS/SCSS, PostCSS
  • 예: 변수, 믹스인, 조건문 등을 사용
  • 장점: 정적 스타일링과 변수 활용이 유리
  • 단점: 동적 상태 기반 스타일링엔 한계 있음

✨ 결론

  • 빠른 개발 + 디자인 시스템 = Tailwind
  • 동적 스타일, 테마 기반 구조화 = Styled-Components
  • 기존 CSS에 익숙하고, 간단하게 하고 싶다면 = CSS Module