# [[λͺ¨λ“ˆμ‹ CSS(Modular CSS)]] ## πŸ“Œ Brief Summary λͺ¨λ“ˆμ‹ CSS(CSS Modules)λŠ” 둜컬 λ²”μœ„(Local scope)의 CSS 클래슀 이름을 μžλ™μœΌλ‘œ μƒμ„±ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈ λ‹¨μœ„λ‘œ μŠ€νƒ€μΌμ„ μΊ‘μŠν™”ν•˜λŠ” CSS μ•„ν‚€ν…μ²˜ 및 λ„κ΅¬μž…λ‹ˆλ‹€ [1, 2]. λΉŒλ“œ νƒ€μž„μ— 클래슀 이름을 κ³ μœ ν•œ μ‹λ³„μžλ‘œ λ³€ν™˜ν•˜μ—¬ κΈ€λ‘œλ²Œ λ„€μž„μŠ€νŽ˜μ΄μŠ€ μΆ©λŒμ„ μ›μ²œμ μœΌλ‘œ λ°©μ§€ν•˜λ©°, ν‘œμ€€ CSS 문법을 μœ μ§€ν•˜λ©΄μ„œλ„ λŒ€κ·œλͺ¨ ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œμ νŠΈμ—μ„œ λ›°μ–΄λ‚œ μ•ˆμ •μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€ [1, 3]. ## πŸ“– Core Content * **μž‘λ™ 원리 및 μ£Όμš” νŠΉμ§•:** CSS ModulesλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ»΄ν¬λ„ŒνŠΈλ‘œ CSS νŒŒμΌμ„ μž„ν¬νŠΈν•  λ•Œ, λΉŒλ“œ 도ꡬ(Webpack, Vite λ“±)κ°€ μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” 클래슀 이름을 κ³ μœ ν•œ μ‹λ³„μž(예: `Button_button__x9KdL`)둜 λ³€ν™˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€ [1, 4]. 이 κ³Όμ •μ—μ„œ λŸ°νƒ€μž„ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ 없이 정적 CSSλ₯Ό μƒμ„±ν•˜λ―€λ‘œ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [3, 5]. ν‘œμ€€ CSS 문법은 λ¬Όλ‘  λ―Έλ””μ–΄ 쿼리, λ³΅μž‘ν•œ μ• λ‹ˆλ©”μ΄μ…˜, μ˜μ‚¬ μš”μ†Œ(pseudo-elements) 등을 μ œμ•½ 없이 μ‚¬μš©ν•  수 있으며, Sass(SCSS)와 같은 μ „μ²˜λ¦¬κΈ°μ™€λ„ λ§€λ„λŸ½κ²Œ ν†΅ν•©λ©λ‹ˆλ‹€ [1, 6]. * **μž₯점 (μœ μ§€λ³΄μˆ˜ 및 μ„±λŠ₯):** κ°€μž₯ 큰 μž₯점은 μ™„λ²½ν•œ 둜컬 μŠ€μ½”ν”„(Local scope)λ₯Ό ν†΅ν•œ μΊ‘μŠν™”λ‘œ, λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ™€μ˜ μŠ€νƒ€μΌ μΆ©λŒμ΄λ‚˜ μŠ€νƒ€μΌ λˆ„μˆ˜(Leakage)λ₯Ό λ°©μ§€ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ [1, 2]. 제둜 λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œ 덕뢄에 λ Œλ”λ§ μ„±λŠ₯이 맀우 μš°μˆ˜ν•˜λ©° λΈŒλΌμš°μ € 캐싱을 효과적으둜 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [7, 8]. λ˜ν•œ νƒ€μž…μŠ€ν¬λ¦½νŠΈ(TypeScript)와 κ²°ν•©ν•˜μ—¬ λΉŒλ“œ νƒ€μž„μ— μ˜€νƒ€λ₯Ό μž‘μ„ 수 있으며, μ—¬λŸ¬ νŒ€μ΄ ν˜‘μ—…ν•˜λŠ” ν™˜κ²½μ—μ„œ 클래슀 λͺ…λͺ…에 λŒ€ν•œ λ…ΌμŸμ„ 쀄이고 μ»΄ν¬λ„ŒνŠΈμ˜ μ†Œμœ κΆŒμ„ λͺ…ν™•νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [9]. * **단점 및 ν•œκ³„:** 둜직이 λ‹΄κΈ΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일과 μŠ€νƒ€μΌμ΄ λ‹΄κΈ΄ CSS 파일 두 곳을 μ˜€κ°€λ©° μž‘μ—…ν•΄μ•Ό ν•˜λŠ” μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­(Context switching)의 λ²ˆκ±°λ‘œμ›€μ΄ μžˆμŠ΅λ‹ˆλ‹€ [5]. λ˜ν•œ, μŠ€νƒ€μΌ μΆ©λŒμ€ λ°©μ§€λ˜μ§€λ§Œ 클래슀 이름 μžμ²΄λŠ” κ°œλ°œμžκ°€ 직접 μ§€μ–΄μ£Όμ–΄μ•Ό ν•˜λ―€λ‘œ μž‘λͺ… ν”Όλ‘œλ„(Naming fatigue)κ°€ μ—¬μ „νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€ [5]. λ”λΆˆμ–΄ μ»΄ν¬λ„ŒνŠΈμ˜ propsλ‚˜ μƒνƒœμ— 따라 λ™μ μœΌλ‘œ μŠ€νƒ€μΌμ„ ν• λ‹Ήν•˜λ €λ©΄ λ¬Έμžμ—΄ μ—°κ²°μ΄λ‚˜ 헬퍼 라이브러리λ₯Ό 거쳐야 ν•˜λ©°, CSS와 μžλ°”μŠ€ν¬λ¦½νŠΈ κ°„μ˜ 데이터 κ³΅μœ κ°€ κΉŒλ‹€λ‘œμš΄ νŽΈμž…λ‹ˆλ‹€ [5, 6]. * **싀무 μ „λž΅ 및 ꢌμž₯ 사항:** CSS ModulesλŠ” λ³΅μž‘ν•œ μ»€μŠ€ν…€ λ””μžμΈ μ‹œμŠ€ν…œμ΄λ‚˜ μ •κ΅ν•œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ ν•„μš”ν•˜λ©°, κΈ°μ‘΄ 바닐라 CSSλ‚˜ SCSS 기반의 ν™˜κ²½μ—μ„œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜λ €λŠ” 쑰직에 κ°€μž₯ μ ν•©ν•œ μ „λž΅μœΌλ‘œ ν‰κ°€λ°›μŠ΅λ‹ˆλ‹€ [8, 10]. 2025λ…„ κΈ°μ€€, Next.js App Router(React Server Components)와 같은 μ΅œμ‹  ν™˜κ²½μ—μ„œλŠ” μ„±λŠ₯ μ˜€λ²„ν—€λ“œκ°€ 큰 λŸ°νƒ€μž„ CSS-in-JSλ₯Ό λŒ€μ‹ ν•  κ°€μž₯ ν›Œλ₯­ν•œ λŒ€μ•ˆ 쀑 ν•˜λ‚˜λ‘œ κ°•λ ₯히 ꢌμž₯λ©λ‹ˆλ‹€ [11, 12]. μ‹€λ¬΄μ—μ„œλŠ” μ™„λ²½ν•œ μΊ‘μŠν™”μ˜ 이점을 λˆ„λ¦¬λ©΄μ„œλ„ CSS Modules 파일 λ‚΄λΆ€μ μœΌλ‘œ BEM(Block Element Modifier) 넀이밍 κ·œμΉ™μ„ 일뢀 κ²°ν•©ν•˜μ—¬ 가독성을 λ†’μ΄λŠ” 방법도 널리 μ‚¬μš©λ©λ‹ˆλ‹€ [13]. ## πŸ”— Knowledge Connections - **Related Topics:** [[BEM]], [[Tailwind CSS]], [[CSS-in-JS]], [[CSS ꡬ쑰 섀계 방식]] - **Projects/Contexts:** [[React μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ (RSC) 및 Next.js ν™˜κ²½]], [[λŒ€κ·œλͺ¨ ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œμ νŠΈ μ•„ν‚€ν…μ²˜]] - **Contradictions/Notes:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄, 전톡적인 BEM 방식은 개발자의 μˆ˜λ™μ μΈ κ·œμΉ™ μ€€μˆ˜μ— μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— μ‹€μˆ˜λ‘œ μΈν•œ μŠ€νƒ€μΌ 좩돌 κ°€λŠ₯성이 남아 μžˆλŠ” 반면, CSS ModulesλŠ” λΉŒλ“œ 도ꡬλ₯Ό 톡해 μ‹λ³„μžλ₯Ό μƒμ„±ν•¨μœΌλ‘œμ¨ 이λ₯Ό μ‹œμŠ€ν…œμ μœΌλ‘œ μ™„λ²½νžˆ μžλ™ν™”ν•˜μ—¬ ν•΄κ²°ν•©λ‹ˆλ‹€ [2, 14]. λ˜ν•œ Tailwind CSSλŠ” νŒŒμΌμ„ 이동할 ν•„μš” 없이 λΉ λ₯Έ 개발이 κ°€λŠ₯ν•˜μ§€λ§Œ λ§ˆν¬μ—…(HTML/JSX)이 맀우 μž₯ν™©ν•΄μ§„λ‹€λŠ” 단점이 μžˆλŠ” 반면, CSS ModulesλŠ” λ§ˆν¬μ—…μ„ κΉ”λ”ν•˜κ²Œ μœ μ§€ν•  수 μžˆλŠ” λŒ€μ‹  μŠ€νƒ€μΌ 파일과 둜직 νŒŒμΌμ„ μ˜€κ°€λŠ” μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­ λΉ„μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€ [5, 15]. --- *Last updated: 2026-04-26*