๋ชจ๋์ CSS์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์คํ์ผ๋ง ์ ๋ต
ํ๋ ์น ๊ฐ๋ฐ์์๋ ์ปดํฌ๋ํธ ๋จ์๋ก UI๋ฅผ ๊ตฌ์ฑํ๊ณ , ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ์ ๋ ๋ฆฝ์ ์ธ ์คํ์ผ์ ์ ์ฉํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ํต์ฌ ์์์ ๋๋ค. ๋ฆฌ์กํธ(React) ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ CSS ํ์ผ์ด ์ ์ญ์ ์ผ๋ก ์ ์ฉ๋๊ฑฐ๋, ์คํ์ผ์ด ์ค๋ณต๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ชจ๋์ CSS ์ ๊ทผ๋ฒ์ด ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ CSS Modules, SASS, LESS ๋ฑ ๋ค์ํ ์คํ์ผ๋ง ๊ธฐ๋ฒ์ ํ์ฉํ์ฌ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ชจ๋ํํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋์ CSS์ ํ์์ฑ๊ณผ ๊ฐ๋
์ ํต์ ์ธ CSS ๋ฐฉ์์ ์ ์ญ ๋ค์์คํ์ด์ค ๋ฌธ์ ๋ก ์ธํด ์คํ์ผ ์ถฉ๋, ์ค๋ณต ์ฝ๋ ๋ฑ์ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํต๋๋ค. ํนํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์๋ง์ ์ปดํฌ๋ํธ๋ค์ด ํจ๊ป ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ๋ฌธ์ ๋ ์ ์ง๋ณด์์ ํ์ ์ ํฐ ์ด๋ ค์์ ์ฃผ๊ฒ ๋ฉ๋๋ค. ๋ชจ๋์ CSS๋ ๊ฐ ์ปดํฌ๋ํธ ๋ณ๋ก ๋ ๋ฆฝ์ ์ธ CSS ํ์ผ์ ์์ฑํ์ฌ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ๋ก์ปฌ ์ค์ฝํ๋ก ํ์ ํจ์ผ๋ก์จ, ์คํ์ผ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ฝ๋์ ์ผ๊ด์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ฆฌ์กํธ์ ๊ฐ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ํ๋ ์์ํฌ์์๋ CSS Modules์ ๊ฐ์ ๊ธฐ๋ฒ์ ์ ์ฉํ๋ฉด, ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ์ ๊ณ ์ ํ ์คํ์ผ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ ์ปดํฌ๋ํธ ๋จ์๋ก ์คํ์ผ์ ์บก์ํํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
CSS Modules
CSS Modules๋ ๊ฐ CSS ํ์ผ์ ๋ชจ๋ ๋จ์๋ก ๋ถ๋ฆฌํ๊ณ , ํด๋น ํ์ผ ๋ด์์ ์ ์๋ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ๋ก์ปฌ ์ค์ฝํ๋ก ํ์ ํด์ฃผ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์คํ์ผ ์ถฉ๋ ์์ด, ์ปดํฌ๋ํธ์ ํ์ํ ์คํ์ผ๋ง์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ ๋ฐ ์์
CSS Modules๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, ํ์ผ๋ช ์ ๋ณดํต ComponentName.module.css์ ๊ฐ์ด ์ง์ ํฉ๋๋ค. ์๋๋ ๊ฐ๋จํ ๋ฒํผ ์ปดํฌ๋ํธ์ ํจ๊ป CSS Modules๋ฅผ ํ์ฉํ ์์ ์ ๋๋ค.
/* Button.module.css */
.button {
background-color: #1976d2;
color: #ffffff;
border: none;
padding: 10px 20px;
font-size: 1rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: #1565c0;
}
// Button.jsx
import React from 'react';
import styles from './Button.module.css';
const Button = ({ label, onClick }) => {
return (
<button className={styles.button} onClick={onClick}>
{label}
</button>
);
};
export default Button;
์ ์์ ์์ Button.module.css์ ์ ์๋ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ๊ณ ์ ํ ์ด๋ฆ์ผ๋ก ๋ณํ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ถฉ๋์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
SASS์ LESS์ ํ์ฉ
SASS(Syntactically Awesome Style Sheets)์ LESS๋ CSS ์ ์ฒ๋ฆฌ๊ธฐ(Preprocessor)๋ก, ๋ณ์, ์ค์ฒฉ, ๋ฏน์ค์ธ(mixin), ์์ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ณด๋ค ํจ์จ์ ์ธ ์คํ์ผ ์์ฑ์ด ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ฆฌ์กํธ ํ๋ก์ ํธ์์๋ SASS๋ LESS๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์คํ์ผ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
SASS ์์
SASS๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์์ ์ค์ฒฉ ๊ตฌ์กฐ๋ฅผ ํตํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค. ์๋๋ SASS๋ฅผ ํ์ฉํ ๋ฒํผ ์คํ์ผ ์์ ์ ๋๋ค.
/* Button.scss */
$primary-color: #1976d2;
$hover-color: #1565c0;
$font-color: #ffffff;
.button {
background-color: $primary-color;
color: $font-color;
border: none;
padding: 10px 20px;
font-size: 1rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
&:hover {
background-color: $hover-color;
}
}
// ButtonWithSass.jsx
import React from 'react';
import './Button.scss';
const ButtonWithSass = ({ label, onClick }) => {
return (
<button className="button" onClick={onClick}>
{label}
</button>
);
};
export default ButtonWithSass;
SASS์ ๋ณ์์ ์ค์ฒฉ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด, ํ ๋ง ๋ณ๊ฒฝ์ด๋ ์คํ์ผ ์กฐ์ ์ ๋ณด๋ค ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค.
LESS ์์
LESS๋ SASS์ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋ฌธ๋ฒ๊ณผ ์ฌ์ฉ ๋ฐฉ์์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์๋๋ LESS๋ฅผ ํ์ฉํ ์์ ์ ๋๋ค.
/* Button.less */
@primary-color: #1976d2;
@hover-color: #1565c0;
@font-color: #ffffff;
.button {
background-color: @primary-color;
color: @font-color;
border: none;
padding: 10px 20px;
font-size: 1rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
&:hover {
background-color: @hover-color;
}
}
// ButtonWithLess.jsx
import React from 'react';
import './Button.less';
const ButtonWithLess = ({ label, onClick }) => {
return (
<button className="button" onClick={onClick}>
{label}
</button>
);
};
export default ButtonWithLess;
LESS ์ญ์ ๋ณ์์ ๋ฏน์ค์ธ์ ํ์ฉํ์ฌ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ผ๋ฉฐ, ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์คํ์ผ๋ง ์ ๋ต
๋ชจ๋์ CSS์ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํ์ฉํ ์คํ์ผ๋ง ๊ธฐ๋ฒ์ ๋จ์ํ ์ฝ๋๋ฅผ ๋ชจ๋ํํ๋ ๋ฐ ๊ทธ์น์ง ์๊ณ , ๋ค์๊ณผ ๊ฐ์ ์ ๋ต์ ํตํด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ผ ๊ด๋ฆฌ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
- ๋์์ธ ์์คํ
๊ตฌ์ถ
์ปดํฌ๋ํธ๋ณ๋ก ์ผ๊ด๋ ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ์ ๋ง๋ จํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์์ธ ์์คํ ์ ๊ตฌ์ถํฉ๋๋ค. ์คํ์ผ ๋ณ์, ์ปฌ๋ฌ ํ๋ ํธ, ํ์ดํฌ๊ทธ๋ํผ ๊ท์น ๋ฑ์ ์ค์์์ ๊ด๋ฆฌํ๋ฉด, ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ UI/UX ์ผ๊ด์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค. - ์ปดํฌ๋ํธ ๋จ์์ ์คํ์ผ ์บก์ํ
๊ฐ ์ปดํฌ๋ํธ๋ ์์ ๋ง์ ์คํ์ผ ํ์ผ์ ๊ฐ๋๋ก ํ์ฌ, ์ธ๋ถ ์ํฅ ์์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ง๋ณด์ํ ์ ์๋๋ก ํฉ๋๋ค. CSS Modules๋ฅผ ํ์ฉํ๋ฉด ์ด๋ฌํ ์บก์ํ๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฃจ์ด์ง๋๋ค. - ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ ๊ณ ๋ ค
SASS์ LESS์ ๋ฏน์ค์ธ, ํจ์ ๋ฑ์ ํ์ฉํ์ฌ ๊ณตํต ์คํ์ผ ์์๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ก ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ๋ณต๋๋ ์คํ์ผ ์ฝ๋๋ฅผ ์ค์ด๊ณ , ์์ ์ ์ ์ง๋ณด์ ๋น์ฉ์ ์ต์ํํ ์ ์์ต๋๋ค. - ํ
๋ง ์ ํ ๋ฐ ์ฌ์ฉ์ ์ค์ ์ง์
CSS ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ณ์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋คํฌ ๋ชจ๋, ๋ผ์ดํธ ๋ชจ๋ ๋ฑ ๋ค์ํ ํ ๋ง๋ฅผ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋๋ก ์ค๊ณํฉ๋๋ค. ๋์์ธ ์์คํ ๊ณผ ์ฐ๊ณํ์ฌ ์ฌ์ฉ์ ๋ง์ถคํ UI๋ฅผ ๊ตฌํํ๋ฉด, ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์คํ์ผ๋ง์ ๋จ์ํ ์ธ๊ด์ ๊พธ๋ฏธ๋ ๊ฒ์ ๋์ด์, ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๊ฒฐ์ ์ง๋ ์ค์ํ ์์์ ๋๋ค. CSS Modules, SASS, LESS ๋ฑ ๋ค์ํ ์คํ์ผ๋ง ๊ธฐ๋ฒ์ ์ ์ ํ ํ์ฉํ๋ฉด, ๊ฐ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ชจ๋ํํ๊ณ ์บก์ํํ ์ ์์ผ๋ฉฐ, ๊ธ๋ก๋ฒ ๋์์ธ ์์คํ ๊ณผ ์ฐ๊ณํ์ฌ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ชจ๋์ CSS๋ ํด๋์ค ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ , ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํตํด ๋ณ์์ ๋ฏน์ค์ธ์ ํ์ฉํ๋ฉด ๋ณด๋ค ํจ์จ์ ์ธ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํด์ง๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ํ ๋ด ํ์ ์์๋ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์์ผ, ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ์ด์์ ํฐ ๋์์ ์ค ๊ฒ์ ๋๋ค.
์์ผ๋ก ๋ฆฌ์กํธ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋, ๋ชจ๋์ CSS์ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ๊ทน ๋์ ํ์ฌ ์ปดํฌ๋ํธ ์คํ์ผ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ์ฌ์ฉ์ ๋ง์ถคํ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ์๊ธธ ๊ถ์ฅ๋๋ฆฝ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ํจ์จ์ฑ๊ณผ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ๋์์ ๋ฌ์ฑํ ์ ์์ ๊ฒ์ ๋๋ค.
๋๊ธ