๐งโ๐ป์ด ๊ธ์ ํ์์ ๊ฐ์ธ ํ๋ก์ ํธ์ ์ฌ์ฉํ CSS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ตํ๊ณ , ๊ทธ ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ์ง๋ฅผ ๊ณ ๋ฏผํ๋ ๊ณผ์ ์ ์์ฑ๋์์ต๋๋ค.
HTML
์ด ์ฒ์ ๋ฑ์ฅํ์ ๋, ์น ํ์ด์ง์ ๋์์ธ๊ณผ ๋ ์ด์์์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์ ํ์ ์ด์์ต๋๋ค. ์น ๊ฐ๋ฐ์๋ HTML ํ๊ทธ์ ์ง์ ์คํ์ผ์ ์ ์ฉํ๋ ์ธ๋ผ์ธ ์คํ์ผ
๋ฐฉ์์ ์ฃผ๋ก ์ฌ์ฉํ๋๋ฐ, ์ด ๋ฐฉ์์ ๋ชจ๋ ์คํ์ผ ์ ๋ณด๋ฅผ ๊ฐ ์์์ ์ง์ ๊ธฐ์ ํ๋ ๋ฐฉ์์ด์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฒํผ์ ํ๋์ ๋ฐฐ๊ฒฝ๊ณผ ํฐ์ ํ
์คํธ๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ด HTML ํ๊ทธ ๋ด๋ถ์ ์คํ์ผ์ ์ผ์ผ์ด ์์ฑํด์ผ ํ์ต๋๋ค.
<!-- css ๋ฑ์ฅ ์ด์ , inline style ๋ก ์์ฑ๋ HTML-->
<div style="background-color: blue; color: white; padding: 10px; border-radius: 5px;">
Click Me
</div>
์ด๋ฐ ๋ฐฉ์์ ์ด๊ธฐ ์น์์๋ ๊ฐ๋จํ๊ณ ์ ์ฉํ์ง๋ง, ์น์ฌ์ดํธ๊ฐ ์ ์ ๋ ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ฝ๋์ ์ค๋ณต๊ณผ ์ ์ง๋ณด์์ ์ด๋ ค์์ด๋ผ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ๋์ผํ ์คํ์ผ์ ์ฌ๋ฌ ๊ณณ์ ์ ์ฉํ๋ ค๋ฉด HTML ๊ณณ๊ณณ์ ์คํ์ผ์ ๋ฐ๋ณตํด์ ์์ฑํด์ผ ํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋๋ง๋ค ๋ชจ๋ ํ์ด์ง์์ ํด๋น ์คํ์ผ์ ์์์ ์ผ๋ก ์์ ํด์ผ ํ์ต๋๋ค. ๋ํ, ์ธ๋ผ์ธ ์คํ์ผ์ ๋ฌธ์ ๊ตฌ์กฐ์ ๋์์ธ์ด ๊ฒฐํฉ๋์ด ์์ด ์๊ฐ์ ์คํ์ผ๊ณผ ์ฝํ ์ธ ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด CSS(Cascading Style Sheets)
์
๋๋ค. CSS๋ ์น ํ์ด์ง์ ์คํ์ผ์ ์ค์์์ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ, HTML ๋ฌธ์์ ๊ตฌ์กฐ์ ์คํ์ผ์ ๋ถ๋ฆฌํ๋ ํ์ ์ ๊ฐ์ ธ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ HTML ์์์ ๋ํ ์คํ์ผ ๊ท์น์ ๋ณ๋์ CSS ํ์ผ์ ์ ์ํ ์ ์๊ฒ ๋์๊ณ , ์ด๋ ๊ฒ ๋ถ๋ฆฌ๋ ์คํ์ผ ๊ท์น์ ์ผ๊ด์ฑ ์๋ ๋์์ธ๊ณผ ํจ์จ์ ์ธ ์ ์ง๋ณด์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
<!-- HTML ํ์ผ -->
<div class="button">Click Me</div>
<!-- CSS ํ์ผ -->
.button {
background-color: blue;
color: white;
padding: 10px;
border-radius: 5px;
}
๊ทธ๋ฌ๋ CSS๋ ํฌ๊ฒ ๋๊ฐ์ง์ ํ๊ณ์ ์ด ์กด์ฌํ์ต๋๋ค. ์ฐ์ ,Global Scope
๋ก ์ธํด ์ ์ญ์ ์ผ๋ก ์คํ์ผ์ด ์ ์ฉ๋๋ฉด์ ํด๋์ค ์ด๋ฆ ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ ์คํ์ผ์ด ์ ์ฉ๋ ์ ์์ผ๋ฉฐ, ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ์ด๋ฌํ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ๋ํ Specificity(์ฐ์ ์์) ๊ท์น
์ ์คํ์ผ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ด ๋ณต์กํ์ฌ, ํน์ ์คํ์ผ์ ๋ฎ์ด์ฐ๊ฑฐ๋ ์ฐ์ ์ ์ฉ๋๊ฒ ๋ง๋ค๊ธฐ ์ํด !important
๋ ๋งค์ฐ ๊ธด ์ ํ์ ์ฒด์ธ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ก ์ธํด ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๊ณ , ์คํ์ผ๋ง ์ฝ๋๊ฐ ๋นํจ์จ์ ์ผ๋ก ์์ฑ๋๋ ํ๊ณ๊ฐ ์์ต๋๋ค.
Specificity(์ฐ์ ์์)
๋ CSS์์ ์ฌ๋ฌ ์คํ์ผ ๊ท์น์ด ๋์ผํ ์์์ ์ ์ฉ๋ ๋, ์ด๋ค ์คํ์ผ์ด ์ฐ์ ์ ์ฉ๋ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ท์น์
๋๋ค. Specificity ๋ฌธ์ ๋ ์ด๋ฌํ ์ฐ์ ์์ ๊ณ์ฐ์ด ๋ณต์กํด์ง๋ฉด์, ๊ฐ๋ฐ์๊ฐ ์๋ํ ๋๋ก ์คํ์ผ์ ์ฝ๊ฒ ์กฐ์ํ๊ธฐ ์ด๋ ค์์ง๋ ์ํฉ์ ์ง์นญํฉ๋๋ค.
CSS์์ Specificity๋ ์ ํ์์ ์ข ๋ฅ์ ๋ฐ๋ผ ์ ์๋ฅผ ๊ณ์ฐํ์ฌ ๊ฒฐ์ ๋ฉ๋๋ค. ์ ์๊ฐ ๋์์๋ก ์ฐ์ ์์๊ฐ ๋์ผ๋ฉฐ, ์๋์ ๊ท์น์ ๋ฐ๋ผ ๊ณ์ฐ๋ฉ๋๋ค.
/* Specificity ์ ์ ๊ณ์ฐ ์์*/
div { /* 1์ */
color: black;
}
.button { /* 10์ */
color: blue;
}
#primary { /* 100์ */
color: green;
}
style="color: red" /* 1000์ (์ธ๋ผ์ธ ์คํ์ผ) */
์ ์์์์ ๋์ผํ ์์์ div
, .button
, #primary
, ๊ทธ๋ฆฌ๊ณ ์ธ๋ผ์ธ ์คํ์ผ์ด ์ ์ฉ๋๋ค๋ฉด, ์ฐ์ ์์๊ฐ ๋์ ์ธ๋ผ์ธ ์คํ์ผ์ด ์ต์ข
์ ์ผ๋ก ์ ์ฉ๋์ด ํ
์คํธ ์์์ด ๋นจ๊ฐ์
์ด ๋ฉ๋๋ค.
CSS๊ฐ ๋ ๋ณต์กํ ํ๋ก์ ํธ์์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง์, ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด SCSS
๊ฐ ๊ฐ๋ฐ๋์์ต๋๋ค. SCSS๋ CSS์ ๋จ์ํจ์ ์ ์งํ๋ฉด์๋ ๋ณ์
, ์ค์ฒฉ
, ๋ฏน์ค์ธ
๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ CSS์ ๋ฐ๋ณต์ ์ธ ์ฝ๋ ์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ๋ ๊ตฌ์กฐ์ ์ธ ์คํ์ผ ์์ฑ์ด ๊ฐ๋ฅํ๋๋ก ํ์ต๋๋ค. SCSS๋ CSS๋ก ์ปดํ์ผ๋๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์คํํ ์ ์์ผ๋ฉฐ, ์ด ์ ์ด ์ปดํ์ผ ๊ณผ์ ์ด๋ผ๋ ์ถ๊ฐ ์์
์ ์๊ตฌํ์ง๋ง, ๋๊ท๋ชจ ํ๋ก์ ํธ์์์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์์ผฐ์ต๋๋ค.
$primary-color: blue;
@mixin button-styles($color, $padding) {
background-color: $color;
padding: $padding;
border: none;
border-radius: 5px;
color: white;
}
.button {
@include button-styles(blue, 10px);
background-color: $primary-color;
color: white;
padding: 10px;
.icon {
margin-right: 5px;
}
}
.button-secondary {
@include button-styles(green, 15px);
}
๋ค๋ง SCSS๋ ์ฌ์ ํ Specificity ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ฉฐ, ์ค์ฒฉ๋ ๊ท์น์ด ๋ง์์ง์๋ก ์ฐ์ ์์ ๊ด๋ฆฌ๊ฐ ๋ ์ด๋ ค์์ง ์ ์์ต๋๋ค. ๋ํ, SCSS๋ ์ปดํ์ผ ๋จ๊ณ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ง ์ ์์ผ๋ฉฐ, ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋๋ฒ๊น ์ด ๋ ์ด๋ ค์์ง๋๋ค.
CSS ํด๋์ค ์ด๋ฆ์ ์ถฉ๋ ๋ฌธ์ ์ ์ ์ญ ์ค์ฝํ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ฑ์ฅํ ๋ฐฉ๋ฒ๋ก ์ด BEM(Block Element Modifier)
์
๋๋ค. BEM์ CSS ํด๋์ค ์ด๋ฆ์ Block__Element--Modifier๋ผ๋ ๊ตฌ์กฐ์ ์ธ ๊ท์น์ ๋ฐ๋ผ ๋ช
๋ช
ํจ์ผ๋ก์จ, ํด๋์ค๋ฅผ ๋ณด๋ค ๋ชจ๋ํ๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํด๋์ค ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ , ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ ๋ฐฉ์์ ๋ง์ถ ์คํ์ผ๋ง์ ์ ๊ณตํฉ๋๋ค.
.button__icon--small {
width: 20px;
height: 20px;
}
๊ทธ๋ฌ๋ BEM์ ํด๋์ค ๋ช ๋ช ๊ท์น์ ์๊ฒฉํ๊ฒ ๋ฐ๋ผ์ผ ํ๋ฉฐ, ํ๋ก์ ํธ๊ฐ ๋ณต์กํด์ง์๋ก ํด๋์ค ์ด๋ฆ์ด ๊ธธ์ด์ ธ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ๋ํ, ๊ธธ์ด์ง ํด๋์ค ์ด๋ฆ์ ๋ฐ๋ณตํด์ ์์ฑํด์ผ ํ๋ฏ๋ก, ์ฝ๋ ์์ฐ์ฑ์๋ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
CSS์ ์ ์ญ ์ค์ฝํ ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด, 2015๋
์๋ CSS Modules
๊ฐ ๋ฑ์ฅํ์ต๋๋ค. CSS Modules๋ CSS ํ์ผ์ ๋ชจ๋ํํ์ฌ ๊ฐ ์ปดํฌ๋ํธ๊ฐ ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ๊ฐ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ํตํด ๊ธ๋ก๋ฒ ์ค์ฝํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ปดํฌ๋ํธ ๋จ์๋ก ์คํ์ผ์ ๊ด๋ฆฌํ ์ ์์ด ์ ์ง๋ณด์๊ฐ ํจ์ฌ ์ฉ์ดํด์ก์ต๋๋ค. CSS ํ์ผ์ ๊ณ ์ ํ ํด์ ๊ฐ์ ๋ถ์ฌํ์ฌ, ํด๋์ค ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๋ฉฐ, ์คํ์ผ์ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์์ ํ๊ฒ ์บก์ํํ ์ ์์ต๋๋ค.
/* Button.module.css */
.button {
background-color: blue;
color: white;
}
// Button.jsx
import styles from './Button.module.css';
export default function Button() {
return <button className={styles.button}>Click Me</button>;
}
๊ทธ๋ฌ๋ CSS Modules๋ ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ ์ค ๋๋ฒ๊น ์ด ์ด๋ ค์์ง ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๊ฐ CSS ํ์ผ์์ ๋ช ์ํ ์ด๋ฆ๊ณผ ์ค์ ๋ธ๋ผ์ฐ์ ์์ ์ ์ฉ๋๋ ์ด๋ฆ์ด ๋ค๋ฅด๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ์์ ์ง์ ํด๋์ค ์ด๋ฆ์ ์ฐพ์๋ณด๊ธฐ ๋ถํธํ๋ฉฐ, CSS ๋๋ฒ๊น ๋๊ตฌ ์ฌ์ฉ ์ ํผ๋์ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ๋ํ, CSS Modules๋ ๋ณ๋์ CSS ํ์ผ์ ์ ์งํด์ผ ํ๋ฏ๋ก, ์คํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๊ณผ ๋ถ๋ฆฌ ๊ด๋ฆฌํด์ผ ํ๋ ์ ์ด ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค.
์ ํต์ ์ธ CSS ๋ฐฉ์์์๋ HTML ์์์ ํด๋์ค๋ฅผ ๋ถ์ฌํ๊ณ , ์ธ๋ถ CSS ํ์ผ์์ ํด๋น ํด๋์ค์ ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐฉ์์ด ์ฃผ๋ก ์ฌ์ฉ๋์์ต๋๋ค. ํ์ง๋ง React์ ๊ฐ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๊ฐ ์ปดํฌ๋ํธ๊ฐ ์์ฒด์ ์ผ๋ก UI์ ๋ก์ง์ ๊ด๋ฆฌํ๋ฏ๋ก, ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์คํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ ์ํ๋ ๋ฐฉ์์ด ๋ ์ ๋ฆฌํ ์ํฉ์ด ๋ง์์ก์ต๋๋ค.
CSS-In-JS
๋ ์ด๋ฌํ ๋ฐฐ๊ฒฝ์์ ํ์ํ์ผ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ด์์ CSS๋ฅผ ์์ฑํ๊ณ , ์ํ๋ props์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์คํ์ผ์ ์กฐ์ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ฐ์ ํ ๊ฒฐํฉ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ , ์คํ์ผ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. CSS-In-JS๋ ๋ฐํ์์ ์คํ์ผ์ ์์ฑํ๊ณ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ global scope ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์๋ ๋์ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ํ์ ์ธ CSS-In-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ styled-components
์ Emotion
์ด ์์ต๋๋ค.
import styled from 'styled-components';
const Button = styled.button`
background-color: ${(props) => (props.primary ? 'blue' : 'gray')};
color: white;
padding: 10px;
`;
export default function App() {
return <Button primary>Click Me</Button>;
}
๊ทธ๋ฌ๋ ๋ฐํ์์์ ์คํ์ผ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ ํ์ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ, ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋๋๋ฌ์ง ์ ์์ต๋๋ค. ํนํ, ์ ๋๋ฉ์ด์ ์ด๋ ์คํฌ๋กค๊ณผ ๊ฐ์ ๋ณต์กํ ๋์์ ์์ฃผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ, ์คํ์ผ์ ์์ฑํ๊ณ DOM์ ์ ์ฉํ๋ ๊ณผ์ ์์ ๋ฐํ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋๋ถ์ด, CSS-In-JS๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํ๋ฉฐ, ๊ทธ๋ก ์ธํด ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ปค์ง๋ ๋จ์ ๋ ์์ต๋๋ค.
Vanilla Extract
๋ Zero-Runtime CSS-In-JS
์ ๋ํ์ ์ธ ์๋ก, ๋ฐํ์์ ์คํ์ผ์ ์์ฑํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ๊ทน๋ํํ CSS ๊ด๋ฆฌ ๋ฐฉ์์
๋๋ค. ๊ธฐ์กด CSS-In-JS ๋ฐฉ์์ด ๋ฐํ์์์ ๋์ ์ผ๋ก ์คํ์ผ์ ์์ฑํ๋ฉฐ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์๋ค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค. Vanilla Extract๋ ๋น๋ ํ์์ CSS ํ์ผ์ ์์ฑํจ์ผ๋ก์จ ๋ฐํ์ ์ค๋ฒํค๋๊ฐ ์๊ณ , TypeScript๋ฅผ ํ์ฉํ์ฌ ํ์
์์ ์ฑ์ ๋ณด์ฅํ๋ฉด์๋ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค. ์คํ์ผ๊ณผ ๋ก์ง์ด ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋๋ฉด์๋ ๋ฐํ์์์์ ๋น์ฉ์ ์ค์ผ ์ ์์ด, ๋ณต์กํ UI์์๋ ๋์ ์ฑ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค.
// styles.css.ts
import { style } from '@vanilla-extract/css';
export const button = style({
backgroundColor: 'blue',
color: 'white',
padding: '10px',
});
// Button.jsx
import * as styles from './styles.css';
export default function Button() {
return <button className={styles.button}>Click Me</button>;
}
๊ทธ๋ฌ๋ ๋์ ์คํ์ผ๋ง ๊ธฐ๋ฅ์ด ์ ํ์ ์ด๋ผ๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐํ์์์ ์คํ์ผ์ ์์ฑํ๋ ๋์ ๋น๋ ํ์์ ๋ชจ๋ ์คํ์ผ์ด ๋ฏธ๋ฆฌ ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์, ์ํ์ ๋ฐ๋ผ ์ฆ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๋์ ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐ๋ ์ด๋ ค์์ด ์์ต๋๋ค. ๋ํ, ๋น๋ ๋จ๊ณ์์ ์ถ๊ฐ์ ์ธ ์ค์ ์ด ํ์ํ๋ฉฐ, ์ด๋ฅผ ์ํด Webpack์ด๋ Vite์ ๊ฐ์ ๋น๋ ๋๊ตฌ๋ฅผ ์ค์ ํด์ผ ํ๋ ๋ณต์ก์ฑ์ด ์์ต๋๋ค. ํ๋ก์ ํธ ์ค์ ์ด ๋ณต์กํด์ง ์ ์์ผ๋ฉฐ, ํน์ ์๊ตฌ์ฌํญ์ ๋ง์ถ ๋์ ์คํ์ผ๋ง์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค.
ํน์ง | CSS-in-JS | Zero-Runtime CSS-in-JS | who wins? |
---|---|---|---|
๋์ ์คํ์ผ๋ง | ์ํ/props์ ๋ฐ๋ผ ์ค์๊ฐ์ผ๋ก ์คํ์ผ ๋ณ๊ฒฝ ๊ฐ๋ฅ | ๋น๋ ์์ ์ ์คํ์ผ์ด ๊ฒฐ์ ๋์ด ์ ํ์ | CSS-in-JS๊ฐ ๋ ์ ์ฐํ์ง๋ง, Zero-Runtime์ด ๋ ์ฑ๋ฅ์ด ์ข์ |
์ฑ๋ฅ | ๋ฐํ์์ ์ฑ๋ฅ ์ค๋ฒํค๋ ๋ฐ์ ๊ฐ๋ฅ | ๋ฐํ์์์ ์คํ์ผ ์์ฑ ์์ด ์ฑ๋ฅ ์ต์ ํ | ๋๋ถ๋ถ์ ๊ฒฝ์ฐ Zero-Runtime์ด ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ |
ํ์ ์์ ์ฑ | ์ผ๋ฐ์ ์ผ๋ก ํ์ ์์ ํ์ง ์์ | TypeScript ํตํฉ์ผ๋ก ํ์ ์์ ์ฑ ๋ณด์ฅ | Zero-Runtime์ด ๋ ๋์ ํ์ ์์ ์ฑ ์ ๊ณต |
๋ฒ๋ค ํฌ๊ธฐ | JavaScript ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ | ๋ฒ๋ค ํฌ๊ธฐ ์ต์ํ, ์คํ์ผ์ ๋ณ๋ CSS ํ์ผ๋ก | Zero-Runtime์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ ๋ฒ๋ค ํฌ๊ธฐ |
SSR ํธํ์ฑ | SSR์์ ์ค๋ณต ์คํ์ผ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ | SSR์ ์ต์ ํ, ์คํ์ผ ์ค๋ณต ์์ | Zero-Runtime์ด SSR ํธํ์ฑ์ด ๋ ์ข์ |
CSS-in-JS๋ ๋์ ์คํ์ผ๋ง์ด ์ค์ํ ํ๋ก์ ํธ์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ํ ๊ธฐ๋ฐ UI, ์กฐ๊ฑด๋ถ ๋ ๋๋ง, ์ค์๊ฐ ์ฌ์ฉ์ ์ธํฐ๋์ ์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ํํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ฐ์ํ ์น์ฌ์ดํธ์์๋ CSS-in-JS๊ฐ ๋ ํฐ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ฌ ๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ๋ฉด, Zero-Runtime CSS-in-JS๋ ์ฑ๋ฅ ์ต์ ํ๊ฐ ์ค์ํ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค. ํนํ, ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐํ์ ์ค๋ฒํค๋ ์์ด ๊ณ ์ฑ๋ฅ์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ ๊ฒฝ์ฐ, Vanilla Extract์ ๊ฐ์ ๋ฐฉ์์ด ๋ ์ ํฉํฉ๋๋ค. ๋ํ TypeScript์์ ํตํฉ์ ํตํด ์์ ์ฑ์ ๋์ผ ์ ์๊ธฐ ๋๋ฌธ์, ๋๊ท๋ชจ ํ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ , ์์ ์ ์ธ ์ฝ๋๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
๋ถ๊ฝ ํ๋ ๋๊ฒฐ ์์์ ์คํ์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๊ด์ ์ฐจ์งํ ์๋ ๋๊ตฌ์ธ๊ฐ ..