# [[Scalable Frontend Design Systems|Scalable Frontend DesignSystems]] ## πŸ“Œ Brief Summary ν™•μž₯ κ°€λŠ₯ν•œ ν”„λ‘ νŠΈμ—”λ“œ λ””μžμΈ μ‹œμŠ€ν…œ(Scalable Frontend [[Design Systems|Design Systems]])은 λ‹€μˆ˜μ˜ ν”„λ‘œμ νŠΈμ™€ ν”Œλž«νΌ μ „λ°˜μ—μ„œ μΌκ΄€λ˜κ³  μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ μ•„ν‚€ν…μ²˜ 및 λ°©λ²•λ‘ μ˜ μ§‘ν•©μž…λ‹ˆλ‹€. λ””μžμΈ 토큰(Design Tokens)을 기반으둜 μ‹œκ°μ  속성을 쀑앙 μ§‘μ€‘ν™”ν•˜κ³ , Tailwind CSSλ‚˜ [[styled-components|styled-components]]와 같은 μŠ€νƒ€μΌλ§ νŒ¨λŸ¬λ‹€μž„μ„ μ μš©ν•˜μ—¬ μž¬μ‚¬μš©μ„±μ„ κ·ΉλŒ€ν™”ν•©λ‹ˆλ‹€ [1, 2]. λ˜ν•œ, μ•„ν† λ―Ή λ””μžμΈ(Atomic Design), 볡합 μ»΄ν¬λ„ŒνŠΈ([[Compound Components|Compound Components]]), 그리고 λͺ¨λ…Έλ ˆν¬([[Monorepo|Monorepo]]) μ•„ν‚€ν…μ²˜λ₯Ό κ²°ν•©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈμ˜ 독립성을 μœ μ§€ν•˜λ©΄μ„œ λŒ€κ·œλͺ¨ ν™•μž₯성을 μ§€μ›ν•˜λŠ” 것이 ν•΅μ‹¬μž…λ‹ˆλ‹€ [3-5]. ## πŸ“– Core Content - **λ””μžμΈ 토큰과 ν…Œλ§ˆ ν™•μž₯μ„± (Design Tokens & Theming)** μ‹œμŠ€ν…œμ˜ 일관성을 보μž₯ν•˜λŠ” 핡심은 **λ””μžμΈ 토큰**μž…λ‹ˆλ‹€. 토큰은 μ›μ‹œ κ°’(Primitive Tokens, 예: `#3366FF`), 의미 기반 토큰(Semantic Tokens, 예: `color.primary`), 그리고 μ»΄ν¬λ„ŒνŠΈ νŠΉν™” ν† ν°μœΌλ‘œ κ³„μΈ΅ν™”λ˜μ–΄ κ΄€λ¦¬λ©λ‹ˆλ‹€ [1, 6-8]. 이 계측 κ΅¬μ‘°λŠ” 닀크 λͺ¨λ“œμ™€ 같은 동적 ν…Œλ§ˆ μ „ν™˜μ„ μˆ˜μ›”ν•˜κ²Œ λ§Œλ“€λ©°, [[Style Dictionary|Style Dictionary]] λ“±μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜λ©΄ [[Figma|Figma]]의 λ””μžμΈ 데이터λ₯Ό React의 CSS λ³€μˆ˜λ‚˜ ν…Œλ§ˆ 객체둜 μžλ™ 동기화할 수 μžˆμ–΄ 개발과 λ””μžμΈ κ°„μ˜ 간극을 μ’νž™λ‹ˆλ‹€ [9-11]. - **μŠ€νƒ€μΌλ§ νŒ¨λŸ¬λ‹€μž„: Tailwind CSS vs Styled-Components** React μƒνƒœκ³„μ˜ μŠ€νƒ€μΌλ§ 접근법은 λŸ°νƒ€μž„ μ„±λŠ₯κ³Ό 개발자 κ²½ν—˜μ˜ κ· ν˜•μ„ λ§žμΆ”λŠ” λ°©ν–₯으둜 λ°œμ „ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. - **Tailwind CSS:** μœ ν‹Έλ¦¬ν‹° 퍼슀트(Utility-first) λ°©μ‹μœΌλ‘œ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ μ—†μœΌλ©°, 5-20kb μˆ˜μ€€μ˜ μž‘μ€ λ²ˆλ“€ 크기λ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [12, 13]. 특히 v4 λ²„μ „λΆ€ν„°λŠ” `@theme` λ””λ ‰ν‹°λΈŒλ₯Ό μ‚¬μš©ν•˜λŠ” CSS-first μ•„ν‚€ν…μ²˜λ₯Ό λ„μž…ν•˜μ—¬ λΉŒλ“œ 속도가 10λ°° ν–₯μƒλ˜μ—ˆμœΌλ©°, λ„€μ΄ν‹°λΈŒ CSS λ³€μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ λ”μš± κ°•λ ₯ν•œ ν…Œλ§ˆ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€ [14, 15]. λŸ°νƒ€μž„ μ»¨ν…μŠ€νŠΈκ°€ μ—†λŠ” **[[React Server Components|React Server Components]](RSC) 및 [[Next.js App Router|Next.js App Router]]에 맀우 적합**ν•˜μ§€λ§Œ, 클래슀λͺ…이 κΈΈμ–΄μ§€λŠ” '클래슀 μŠ€ν”„(class soup)' 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ μ»΄ν¬λ„ŒνŠΈ μΆ”μΆœ 규율이 ν•„μš”ν•©λ‹ˆλ‹€ [16, 17]. - **Styled-Components:** [[JavaScript|JavaScript]] 파일 λ‚΄μ—μ„œ μ»΄ν¬λ„ŒνŠΈμ™€ μŠ€νƒ€μΌμ„ ν•¨κ»˜ κ΄€λ¦¬ν•˜λŠ” CSS-in-JS 라이브러리둜, Prop에 κΈ°λ°˜ν•œ 동적 μŠ€νƒ€μΌλ§μ— κ°•λ ₯ν•©λ‹ˆλ‹€ [18]. ν•˜μ§€λ§Œ μ‹€ν–‰ μ‹œμ μ— CSSλ₯Ό μƒμ„±ν•˜κ³  μ£Όμž…ν•˜λŠ” κ³Όμ •μ—μ„œ **CPU 및 λŸ°νƒ€μž„ μ„±λŠ₯ μ˜€λ²„ν—€λ“œ**κ°€ λ°œμƒν•˜λ©°, React Contextλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— RSC ν™˜κ²½κ³Ό 근본적인 ν˜Έν™˜μ„± 문제([[Next.js 15|Next.js 15]]μ—μ„œλŠ” [[Style Registry|Style Registry]] νŒ¨ν„΄μœΌλ‘œ 우회 지원)λ₯Ό κ²ͺμŠ΅λ‹ˆλ‹€ [13, 19, 20]. - **μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ μ•„ν‚€ν…μ²˜ (Component [[Architecture|Architecture]])** - **μ•„ν† λ―Ή λ””μžμΈ (Atomic Design):** UIλ₯Ό κ°€μž₯ μž‘μ€ λ‹¨μœ„μΈ μ›μž(Atoms)μ—μ„œ μ‹œμž‘ν•΄ λΆ„μž(Molecules), 유기체(Organisms), ν…œν”Œλ¦Ώ, νŽ˜μ΄μ§€λ‘œ κ²°ν•©ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€ [3, 21, 22]. μ΄λŠ” UI의 일관성을 λ†’μ΄μ§€λ§Œ, λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ‹€λ£° λ•ŒλŠ” μœ μ—°μ„±μ΄ λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€ [23]. - **볡합 μ»΄ν¬λ„ŒνŠΈ (Compound Components):** `Accordion.Item`, `Accordion.Header`처럼 μ—¬λŸ¬ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ ν•˜λ‚˜μ˜ μƒνƒœλ₯Ό Contextλ₯Ό 톡해 κ³΅μœ ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€ [24, 25]. 이 νŒ¨ν„΄μ€ μ†ŒλΉ„μžκ°€ UI λ ˆμ΄μ•„μ›ƒμ„ 자유둭게 ꡬ성할 수 μžˆλ„λ‘ 높은 μœ μ—°μ„±μ„ μ œκ³΅ν•˜λ©° λΆˆν•„μš”ν•œ [[Prop Drilling|Prop Drilling]]을 λ°©μ§€ν•©λ‹ˆλ‹€ [4, 26, 27]. - **[[Headless UI|Headless UI]] 및 Overrides νŒ¨ν„΄:** μƒνƒœ 관리 및 μ ‘κ·Όμ„± 둜직만 μ œκ³΅ν•˜κ³  μ‹œκ°μ  μŠ€νƒ€μΌλ§μ€ μ™„μ „νžˆ λΆ„λ¦¬ν•˜λŠ” Headless μ»΄ν¬λ„ŒνŠΈ νŒ¨ν„΄κ³Ό, λ‚΄λΆ€ ν•˜μœ„ μš”μ†Œμ˜ μ†μ„±μ΄λ‚˜ μŠ€νƒ€μΌμ„ μ£Όμž… 및 ꡐ체할 수 있게 ν•˜λŠ” [[Uber Base Web|Uber Base Web]]의 Overrides API νŒ¨ν„΄μ΄ λ³΅μž‘ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ UI 라이브러리 ꡬ좕에 ν™œμš©λ©λ‹ˆλ‹€ [28-30]. - **λŒ€κ·œλͺ¨ ν™•μž₯을 μœ„ν•œ λͺ¨λ…Έλ ˆν¬ 및 폴더 ꡬ쑰 (Monorepo & Organization)** λ‹€μˆ˜μ˜ μ•±κ³Ό 곡유 라이브러리λ₯Ό 단일 μ €μž₯μ†Œμ—μ„œ 관리할 λ•Œ **λͺ¨λ…Έλ ˆν¬(Monorepo)**κ°€ μ‚¬μš©λ©λ‹ˆλ‹€ [5]. pnpm workspacesλ‚˜ [[Turborepo|Turborepo]], Nx λ“±μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•΄ 쒅속성을 κ΄€λ¦¬ν•˜κ³  CI/CD λΉŒλ“œ 캐싱을 μ΅œμ ν™”ν•©λ‹ˆλ‹€ [31-33]. λͺ¨λ…Έλ ˆν¬ λ‚΄λΆ€μ˜ μŠ€νŒŒκ²Œν‹° μ½”λ“œλ₯Ό 막기 μœ„ν•΄, Shared, Entities, Features λ“±μœΌλ‘œ 계측을 λ‚˜λˆ„μ–΄ ν•˜μœ„ 계측이 μƒμœ„ 계측을 μ°Έμ‘°ν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λŠ” **[[Feature-Sliced Design|Feature-Sliced Design]] (FSD)** 방법둠을 μ μš©ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [34, 35]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Design Tokens|Design Tokens]], Tailwind CSS, Styled-Components, [[React Server Components (RSC)|React Server Components (RSC]], [[Atomic Design|Atomic Design]], Compound Components, Monorepo Architecture, [[Feature-Sliced Design|Feature-Sliced Design]] - **Projects/Contexts:** [[Shopify Polaris|Shopify Polaris]], Uber Base Web, Style Dictionary, [[Next.js App Router|Next.js App Router]] - **Contradictions/Notes:** μŠ€νƒ€μΌλ§ μ ‘κ·Ό 방식에 μžˆμ–΄ λͺ…ν™•ν•œ νŠΈλ ˆμ΄λ“œμ˜€ν”„κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. Styled-ComponentsλŠ” μΊ‘μŠν™”μ™€ Prop 기반의 동적 μŠ€νƒ€μΌλ§ μΈ‘λ©΄μ—μ„œ λ›°μ–΄λ‚œ 개발자 κ²½ν—˜μ„ μ œκ³΅ν•˜μ§€λ§Œ λŸ°νƒ€μž„ μ„±λŠ₯ μ˜€λ²„ν—€λ“œ 및 RSC λΉ„ν˜Έν™˜ 문제λ₯Ό κ°€μ§‘λ‹ˆλ‹€. 반면, Tailwind CSSλŠ” 제둜 λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œμ™€ RSC ν™˜κ²½μ— μ΅œμ ν™”λœ 높은 μ„±λŠ₯을 μžλž‘ν•˜μ§€λ§Œ, λ§ˆν¬μ—…μ— μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€κ°€ λˆ„μ λ˜μ–΄ μ½”λ“œ 가독성이 λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μ„±λŠ₯ μ΅œμ ν™”κ°€ ν•„μˆ˜μ μΈ λŒ€κ·œλͺ¨ μ—”ν„°ν”„λΌμ΄μ¦ˆ ν™˜κ²½μ—μ„œλŠ” CSS-in-JSμ—μ„œ Tailwind CSS와 같은 정적/μœ ν‹Έλ¦¬ν‹° 퍼슀트 λ°©μ‹μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜λŠ” μΆ”μ„Έκ°€ ν™•μΈλ©λ‹ˆλ‹€. --- *Last updated: 2026-04-26*