본문 바로가기
프론트엔드/React

React 스타일링 방식 비교 (CSS Modules, styled-components, 일반 CSS)

by 느바 2025. 4. 5.
반응형

React 스타일링 방식 비교 (CSS Modules, styled-components, 일반 CSS)

 

방식 모듈화 클래스 충돌 방지 동적 스타일 가독성/유지보수
CSS Modules
styled-components
일반 CSS ❌ (규모 커지면)

 

1. CSS Modules

  • 파일 확장자: MyComponent.module.css
  • 클래스 이름 자동 고유화 → 충돌 걱정 없음
  • 정적인 스타일에 아주 좋고, 유지보수도 용이함

📁 디렉토리 구조

src/
├── components/
│   └── Button/
│       ├── Button.jsx
│       └── Button.module.css
└── App.jsx

Button.module.css

.button {
  background-color: #4caf50;
  color: white;
  padding: 10px 20px;
  border-radius: 8px;
}

Button.jsx

import React from "react";
import styles from "./Button.module.css";

function Button({ label }) {
  return <button className={styles.button}>{label}</button>;
}

export default Button;

App.jsx

import React from "react";
import Button from "./components/Button/Button";

function App() {
  return <Button label="Click Me" />;
}

export default App;

2. styled-components

  • css-in-js 방식: 스타일을 JS 코드 안에서 정의함
  • 동적 스타일링이 강력함 (props로 스타일 제어 가능)
  • 컴포넌트와 스타일이 완전히 결합되므로 가독성 & 재사용성 높음
  • 단점: 런타임에 스타일이 생성되므로 성능에 약간 영향 있을 수 있음

📁 디렉토리 구조

src/
├── components/
│   └── Button.jsx
└── App.jsx

Button.jsx

import React from "react";
import styled from "styled-components";

const StyledButton = styled.button`
  background-color: ${props => props.primary ? "#007bff" : "#6c757d"};
  color: white;
  padding: 10px 20px;
  border-radius: 8px;
  border: none;
`;

function Button({ label, primary }) {
  return <StyledButton primary={primary}>{label}</StyledButton>;
}

export default Button;

App.jsx

import React from "react";
import Button from "./components/Button";

function App() {
  return (
    <>
      <Button label="Primary" primary />
      <Button label="Default" />
    </>
  );
}

export default App;

3. 일반 CSS (App.css 등)

  • 전통적인 방식
  • React에서 그냥 import './App.css'로 사용
  • 프로젝트 규모 작을 땐 괜찮지만, 커지면 클래스 충돌, 스타일 추적 어려움 등의 단점 존재
 

📁 디렉토리 구조

src/
├── components/
│   └── Button.jsx
├── styles/
│   └── Button.css
└── App.jsx

styles/Button.css

.button {
  background-color: orange;
  color: white;
  padding: 10px 20px;
  border-radius: 8px;
}

Button.jsx

import React from "react";
import "../styles/Button.css";

function Button({ label }) {
  return <button className="button">{label}</button>;
}

export default Button;

App.jsx

import React from "react";
import Button from "./components/Button";

function App() {
  return <Button label="Click Me" />;
}

export default App;

언제 뭐 써야 할까?

상황 추천 방식
규모가 작고 빠르게 만들고 싶다 일반 CSS or CSS Modules
규모가 크고 유지보수가 중요하다 CSS Modules or styled-components
동적으로 스타일을 변경하고 싶다 styled-components
팀원들이 타입 지원 / 모듈화를 원한다 CSS Modules or styled-components

'프론트엔드 > React' 카테고리의 다른 글

react-share 소셜 미디어 공유 버튼 라이브러리  (0) 2025.04.13
Ant Design  (0) 2025.04.12
객체의 불변성  (0) 2025.04.12
useParams vs useNavigate  (1) 2025.04.06
useState vs useEffect  (0) 2025.04.06