August 6, 2025
π§± CSS-in-JS κ³Όμ©: λ°νμ μ€λ²ν€λμ λ²λ€ ν¬κΈ° μ¦κ°, κ·Έλ¦¬κ³ CSS μ΅μ ν λν
React
CSS
μ±λ₯
μν€ν
μ²
μ»΄ν¬λνΈ
λΉλ&λ²λ€λ§
λ λλ§μ λ΅
Summary
CSS-in-JSλ μ μ©ν λꡬμ΄μ§λ§, κ³Όλνκ² μ¬μ©νλ©΄ λ°νμ μ€λ²ν€λ, λ²λ€ ν¬κΈ° μ¦κ°, CSS μ΅μ ν λν λ± λ€μν λ¬Έμ λ₯Ό μΌκΈ°ν©λλ€. CSS Modules, Atomic CSS, μ‘°κ±΄λΆ CSS-in-JS μ¬μ© λ±μ λμμ κ³ λ €νμ¬ νλ‘μ νΈ μꡬμ¬νμ λ§λ μ΅μ μ μ€νμΌλ§ μ λ΅μ μ νν΄μΌ ν©λλ€.
Why Wrong?
CSS-in-JSλ μ»΄ν¬λνΈ μ€νμΌλ§μ κ°λ ₯ν λꡬμ΄μ§λ§, λͺ¨λ μν©μ μ ν©ν ν΄κ²°μ± μ μλλλ€. κ³Όλνκ² μ¬μ©νλ©΄ λ€μκ³Ό κ°μ λ¬Έμ μ μ΄ λ°μν©λλ€.
- λ°νμ μ€λ²ν€λ: CSS-in-JSλ λΈλΌμ°μ κ° HTMLμ νμ±ν ν JavaScriptλ₯Ό μ€ννμ¬ μ€νμΌμ λμ μΌλ‘ μμ±νκ³ μ£Όμ ν©λλ€. μ΄ κ³Όμ μ κΈ°μ‘΄ CSS νμΌ λ‘λ© λ°©μμ λΉν΄ μΆκ°μ μΈ λ°νμ μ€λ²ν€λλ₯Ό λ°μμμΌ μ΄κΈ° λ λλ§ μ±λ₯μ μ νμν¬ μ μμ΅λλ€.
- λ²λ€ ν¬κΈ° μ¦κ°: CSS-in-JS λΌμ΄λΈλ¬λ¦¬λ μ체μ μΌλ‘ μλΉν ν¬κΈ°λ₯Ό κ°μ§λ©°, μ»΄ν¬λνΈλ§λ€ μ€νμΌμ μ μν λλ§λ€ λ²λ€ ν¬κΈ°κ° μ¦κ°ν©λλ€. μ΄λ μ΄κΈ° λ‘λ© μκ° μ¦κ°λ‘ μ΄μ΄μ Έ μ¬μ©μ κ²½νμ μ ν΄ν μ μμ΅λλ€.
- CSS μ΅μ ν λν: CSS-in-JSλ λ°νμμ μ€νμΌμ΄ μμ±λλ―λ‘, μ¬μ©νμ§ μλ CSS κ·μΉμ μ κ±°νλ Dead Code Eliminationμ΄λ CSS Minificationκ³Ό κ°μ μ΅μ ν κΈ°λ²μ μ μ©νκΈ° μ΄λ ΅μ΅λλ€. μ΄λ‘ μΈν΄ λΆνμν μ€νμΌμ΄ κ³μ λ¨μ λ²λ€ ν¬κΈ°λ₯Ό μ¦κ°μν€κ³ μ±λ₯μ μ νμν¬ μ μμ΅λλ€.
- CSS μΊμ± λ¬Έμ : CSS-in-JSλ‘ μμ±λ μ€νμΌμ λ³΄ν΅ JavaScript λ²λ€μ ν¬ν¨λλ―λ‘, CSS νμΌμ²λΌ λ³λλ‘ μΊμ±λμ§ μμ νμ΄μ§ μ΄λ μλ§λ€ μ€νμΌμ λ€μ μμ±ν΄μΌ ν μ μμ΅λλ€. μ΄λ μ¬μ©μ κ²½νμ λμ± μ νμν¬ μ μμ΅λλ€.
- SSR μ±λ₯: μλ² μ¬μ΄λ λ λλ§(SSR) νκ²½μμ CSS-in-JSλ₯Ό μ¬μ©νλ©΄ μ€νμΌμ μλ²μμ μμ±ν΄μΌ νλ―λ‘, μλ² μμμ μλͺ¨μν€κ³ TTFB(Time To First Byte)λ₯Ό μ¦κ°μν¬ μ μμ΅λλ€.
How to Fix?
CSS-in-JSλ₯Ό μ¬μ©ν λλ λ€μκ³Ό κ°μ μ¬νμ κ³ λ €νμ¬ μ μ€νκ² μ μ©ν΄μΌ ν©λλ€.
- CSS Modules: CSS Modulesλ μ»΄ν¬λνΈ μ€μ½νλ₯Ό μ§μνλ©΄μλ CSS νμΌλ‘ κ΄λ¦¬λλ―λ‘, CSS-in-JSμ μ₯μ κ³Ό κΈ°μ‘΄ CSSμ μ₯μ μ λͺ¨λ νμ©ν μ μμ΅λλ€.
- Atomic CSS: Tailwind CSSμ κ°μ Atomic CSS νλ μμν¬λ μ¬μ¬μ© κ°λ₯ν μ€νμΌ ν΄λμ€λ₯Ό μ 곡νμ¬ CSS μμ±λμ μ€μ΄κ³ μ€νμΌ μΌκ΄μ±μ μ μ§ν μ μμ΅λλ€.
- μ‘°κ±΄λΆ CSS-in-JS: μ»΄ν¬λνΈμ μ€νμΌμ΄ λμ μΌλ‘ λ³κ²½λλ κ²½μ°μλ§ CSS-in-JSλ₯Ό μ¬μ©νκ³ , μ μ μΈ μ€νμΌμ CSS νμΌλ‘ κ΄λ¦¬νλ λ°©μμ κ³ λ €ν μ μμ΅λλ€.
- μ μ ν CSS-in-JS λΌμ΄λΈλ¬λ¦¬ μ ν: μ±λ₯ μ΅μ νκ° μ λ CSS-in-JS λΌμ΄λΈλ¬λ¦¬λ₯Ό μ ννκ³ , νμν κΈ°λ₯λ§ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. (μ: Linaria, Astroturf λ±)
- CSS κ·μΉ μ¬μ¬μ©: λμμΈ μμ€ν μ ꡬμΆνμ¬ μ€νμΌ κ·μΉμ μ¬μ¬μ©νκ³ , ν λ§λ₯Ό νμ©νμ¬ μ€νμΌ λ³κ²½μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν΄μΌ ν©λλ€.
Before Code (Bad)
// κ³Όλν CSS-in-JS μ¬μ© μμ (styled-components)
import styled from 'styled-components';
const Button = styled.button`
background-color: ${props => props.primary ? 'palevioletred' : 'white'};
color: ${props => props.primary ? 'white' : 'palevioletred'};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid palevioletred;
border-radius: 3px;
`;
function MyComponent() {
return (
<div>
<Button>Normal Button</Button>
<Button primary>Primary Button</Button>
</div>
);
}
After Code (Good)
// CSS Modules μ¬μ© μμ
import styles from './MyComponent.module.css';
function MyComponent() {
return (
<div>
<button className={styles.button}>Normal Button</button>
<button className={`${styles.button} ${styles.primary}`}>Primary Button</button>
</div>
);
}
// MyComponent.module.css
.button {
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid palevioletred;
border-radius: 3px;
}
.primary {
background-color: palevioletred;
color: white;
}
You Might Also Like
CSS Modulesμ λν 곡μ λ¬Έμμ
λλ€. μ»΄ν¬λνΈ μμ€μμ CSSλ₯Ό λͺ¨λννμ¬ μ€νμΌ μΆ©λμ λ°©μ§νκ³ μ¬μ¬μ©μ±μ λμΌ μ μμ΅λλ€.
https://github.com/css-modules/css-modules
Tailwind CSS 곡μ λ¬Έμμ
λλ€. μ νΈλ¦¬ν° μ°μ CSS νλ μμν¬λ‘, Atomic CSS λ°©μμ ν΅ν΄ μ€νμΌ μΌκ΄μ±μ μ μ§νκ³ κ°λ° μλλ₯Ό ν₯μμν¬ μ μμ΅λλ€.
https://tailwindcss.com/docs