Front-end/Styling

[CSS] CSS Module: ์Šคํƒ€์ผ๋ง์„ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๐ŸŽจ

xeunnie 2024. 12. 15. 01:00
728x90
๋ฐ˜์‘ํ˜•

CSS Module ํ†บ์•„๋ณด๊ธฐ! ๐ŸŽจ

CSS Module์€ CSS์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์Šคํƒ€์ผ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ์—์„œ CSS Module์€ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” CSS Module์ด ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


CSS Module์ด๋ž€? ๐Ÿค”

CSS Module์€ CSS ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ์„ ํƒ์ž์˜ ๋ฒ”์œ„๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์ œํ•œํ•˜๋Š” CSS ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. CSS Module์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

์ฃผ์š” ํŠน์ง•

  • ๋กœ์ปฌ ์Šค์ฝ”ํ”„: ๊ฐ ํด๋ž˜์Šค ์ด๋ฆ„์ด ๊ณ ์œ ํ•ด์ ธ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Œ
  • ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง: ์Šคํƒ€์ผ๋ง๋„ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ: ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์ง

CSS Module ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• ๐Ÿ› ๏ธ

(1) ์„ค์น˜ ๋ฐ ์ค€๋น„

CSS Module์€ Webpack ๊ธฐ๋ฐ˜์˜ React ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. Webpack ์„ค์ •์—์„œ CSS Module์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Webpack ์„ค์ •

module.exports = {
  module: {
    rules: [
      {
        test: /\.module\.css$/, // .module.css ํŒŒ์ผ๋งŒ ์ฒ˜๋ฆฌ
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: {
              modules: true, // CSS Module ํ™œ์„ฑํ™”
            },
          },
        ],
      },
    ],
  },
};

 

(2) ์˜ˆ์ œ: ๊ธฐ๋ณธ ์‚ฌ์šฉ

1. CSS ํŒŒ์ผ ์ž‘์„ฑ

Button.module.css

.button {
  background-color: #3498db;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}

.button:hover {
  background-color: #2980b9;
}

 

2. React ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ

Button.js

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

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

export default Button;

๊ฒฐ๊ณผ

  • ํด๋ž˜์Šค ์ด๋ฆ„์€ Webpack์— ์˜ํ•ด button_Button__2x4Wg์™€ ๊ฐ™์ด ๊ณ ์œ ํ•œ ํ•ด์‹œ ๊ฐ’์ด ํฌํ•จ๋œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด๋„ ์ถฉ๋Œํ•˜์ง€ ์•Š์•„์š”.

CSS Module์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ๐ŸŒŸ

1. ๋‹ค์ค‘ ํด๋ž˜์Šค ์ด๋ฆ„ ์‚ฌ์šฉ

CSS Module์—์„œ๋„ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ๊ฒฐํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์ œ

Button.module.css

.button {
  padding: 10px;
}

.primary {
  background-color: blue;
  color: white;
}

 

Button.js

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

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

export default Button;

 

2. ์ „์—ญ ํด๋ž˜์Šค ํ•จ๊ป˜ ์‚ฌ์šฉ

๋กœ์ปฌ ์Šค์ฝ”ํ”„์™€ ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

์˜ˆ์ œ

Button.module.css

.button {
  padding: 10px;
}

.global-class {
  font-size: 20px;
}

 

Button.js

function Button({ label }) {
  return <button className={`global-class ${styles.button}`}>{label}</button>;
}

export default Button;

 

Tip: ์ „์—ญ ํด๋ž˜์Šค๋Š” CSS Module๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ์˜ ์ „์—ญ CSS์—์„œ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

3. Dynamic Class Binding with Classnames

๋‹ค์–‘ํ•œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ์ ์šฉํ•  ๋•Œ classnames ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

(1) ์„ค์น˜

npm install classnames

 

(2) ์‚ฌ์šฉ ์˜ˆ์ œ

Button.js

import styles from "./Button.module.css";
import classNames from "classnames";

function Button({ label, primary }) {
  const buttonClass = classNames(styles.button, {
    [styles.primary]: primary,
  });
  return <button className={buttonClass}>{label}</button>;
}

export default Button;

CSS Module์˜ ์ด์ ๊ณผ ํ•œ๊ณ„ ๐ŸŽฏ

์ด์ 

  1. ํด๋ž˜์Šค ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€: ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์— ์ตœ์ ํ™”
  2. ๋กœ์ปฌ ์Šค์ฝ”ํ”„: ์Šคํƒ€์ผ๋ง ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์–ด ์˜ˆ์ธก ๊ฐ€๋Šฅ
  3. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ: ์Šคํƒ€์ผ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌ
  4. ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ: ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ๊ด€๋ฆฌ ์šฉ์ด

ํ•œ๊ณ„

  1. ํ•™์Šต ๊ณก์„ : CSS Module์˜ ๋ฌธ๋ฒ•๊ณผ ์‚ฌ์šฉ๋ฒ•์„ ์ฒ˜์Œ ์ตํžˆ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ
  2. ์ „์—ญ ์Šคํƒ€์ผ ๊ด€๋ฆฌ: ์ „์—ญ ์Šคํƒ€์ผ์„ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์ถ”๊ฐ€์ ์ธ ์„ค์ •์ด ํ•„์š”
  3. ์ถ”๊ฐ€ ์„ค์ • ํ•„์š”: Webpack๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ๋„๊ตฌ ์„ค์ • ํ•„์ˆ˜

์‹ค๋ฌด์—์„œ์˜ ํ™œ์šฉ ์˜ˆ์ œ ๐Ÿ’ผ

๊ธ€๋กœ๋ฒŒ ํ…Œ๋งˆ์™€ ๊ฒฐํ•ฉ

ํ”„๋กœ์ ํŠธ์˜ ๊ธ€๋กœ๋ฒŒ ํ…Œ๋งˆ์™€ CSS Module์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์ œ

 

Theme.css (์ „์—ญ ์Šคํƒ€์ผ)

:root {
  --primary-color: #3498db;
}

 

Button.module.css

.button {
  background-color: var(--primary-color);
  color: white;
}

CSS Module vs. CSS-in-JS ๐Ÿค”

ํŠน์ง• CSS Module CSS-in-JS
์Šคํƒ€์ผ ์ •์˜ ๋ฐฉ์‹ ์™ธ๋ถ€ .css ํŒŒ์ผ JavaScript ํŒŒ์ผ ๋‚ด๋ถ€
์„ฑ๋Šฅ ๋นŒ๋“œ ์‹œ ์ตœ์ ํ™” ๊ฐ€๋Šฅ ๋Ÿฐํƒ€์ž„์— ์ผ๋ถ€ ์ฒ˜๋ฆฌ
๋Ÿฌ๋‹ ์ปค๋ธŒ CSS ๋ฌธ๋ฒ• ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ๋ง API ํ•™์Šต ํ•„์š”
์œ ์—ฐ์„ฑ ์ „ํ†ต์ ์ธ CSS์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅ ๋™์  ์Šคํƒ€์ผ๋ง๊ณผ ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง์— ๊ฐ•๋ ฅ

๊ฒฐ๋ก : CSS Module, ์Šคํƒ€์ผ๋ง์˜ ํ•„์ˆ˜ ๋„๊ตฌ โœจ

 

CSS Module์€ ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹๊ณผ ์™„๋ฒฝํžˆ ๋งž์•„๋–จ์–ด์ง€๋Š” ์Šคํƒ€์ผ๋ง ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ์Šคํƒ€์ผ ์ถฉ๋Œ ๋ฐฉ์ง€์™€ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฉด์—์„œ ํƒ์›”ํ•œ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. CSS Module์„ ํ™œ์šฉํ•ด ๊น”๋”ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์Šคํƒ€์ผ๋ง์„ ๊ตฌํ˜„ํ•ด ๋ณด์„ธ์š”!

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•