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์ ์ด์ ๊ณผ ํ๊ณ ๐ฏ
์ด์
- ํด๋์ค ์ด๋ฆ ์ถฉ๋ ๋ฐฉ์ง: ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ์ต์ ํ
- ๋ก์ปฌ ์ค์ฝํ: ์คํ์ผ๋ง ๋ฒ์๊ฐ ์ ํ๋์ด ์์ธก ๊ฐ๋ฅ
- ๊ฐ๋ ์ฑ ํฅ์: ์คํ์ผ๊ณผ ์ปดํฌ๋ํธ๋ฅผ ํจ๊ป ๊ด๋ฆฌ
- ์ ์ง๋ณด์์ฑ ํฅ์: ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ฝ๋ ๊ด๋ฆฌ ์ฉ์ด
ํ๊ณ
- ํ์ต ๊ณก์ : CSS Module์ ๋ฌธ๋ฒ๊ณผ ์ฌ์ฉ๋ฒ์ ์ฒ์ ์ตํ๋ ๋ฐ ์๊ฐ์ด ํ์ํ ์ ์์
- ์ ์ญ ์คํ์ผ ๊ด๋ฆฌ: ์ ์ญ ์คํ์ผ์ ํจ๊ป ๊ด๋ฆฌํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ์ค์ ์ด ํ์
- ์ถ๊ฐ ์ค์ ํ์: 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์ ํ์ฉํด ๊น๋ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์คํ์ผ๋ง์ ๊ตฌํํด ๋ณด์ธ์!
๐ท์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท
'Front-end > Styling' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS] Media Query: ๋ฐ์ํ ์น์ ๋ง๋ฒ์ฌ! ๐ฑ (0) | 2024.12.24 |
---|---|
[Emotion] CSS-in-JS๋ก ์คํ์ผ๋ง์ ์๋ก์ด ํจ๋ฌ๋ค์ ๐จ (0) | 2024.12.18 |
[Styled-components] ์คํ์ผ๋ง์ ์ฝ๋์ ๋ น์ฌ๋ด๋ ๋ง๋ฒ ๐ช (3) | 2024.12.16 |
[SASS] SASS-Loader: SCSS์ SASS๋ฅผ ์นํฉ์์ ๋ค๋ฃจ๊ธฐ โจ (1) | 2024.12.14 |
[CSS] CSS, SCSS, ๊ทธ๋ฆฌ๊ณ SASS: ์คํ์ผ๋ง์ ์งํ โจ (1) | 2024.12.13 |