# [[React Design Systems|React DesignSystems]] ## πŸ“Œ Brief Summary React [[Design Systems|Design Systems]](λ¦¬μ•‘νŠΈ λ””μžμΈ μ‹œμŠ€ν…œ)은 μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈ, λ””μžμΈ 토큰(Design Tokens), 그리고 체계적인 μŠ€νƒ€μΌλ§ 방법둠을 κ²°ν•©ν•˜μ—¬ μΌκ΄€λ˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€ [1, 2]. 이 μ‹œμŠ€ν…œμ€ μ•„ν† λ―Ή λ””μžμΈ(Atomic Design)μ΄λ‚˜ μ»΄νŒŒμš΄λ“œ μ»΄ν¬λ„ŒνŠΈ([[Compound Components|Compound Components]]) 같은 μ•„ν‚€ν…μ²˜ νŒ¨ν„΄μ„ 톡해 UI 둜직과 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λΆ„λ¦¬ν•©λ‹ˆλ‹€ [3-5]. 특히 ν˜„λŒ€μ˜ React ν™˜κ²½μ—μ„œλŠ” μ„±λŠ₯ 및 React Server Components(RSC)μ™€μ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ μžˆλŠ” [[CSS-in-JS|CSS-in-JS]] 방식(Styled Components)κ³Ό λΉŒλ“œ νƒ€μž„ μ΅œμ ν™”λ₯Ό μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° 퍼슀트 방식([[Tailwind CSS|Tailwind CSS]]) μ‚¬μ΄μ—μ„œ 기술적 κ· ν˜•μ„ λ§žμΆ”λŠ” 것이 핡심 κ³Όμ œμž…λ‹ˆλ‹€ [6-8]. ## πŸ“– Core Content * **μŠ€νƒ€μΌλ§ νŒ¨λŸ¬λ‹€μž„: Styled Components vs. Tailwind CSS** * **Styled Components (CSS-in-JS):** μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœ(props)에 λ”°λ₯Έ 동적 μŠ€νƒ€μΌλ§κ³Ό λŸ°νƒ€μž„ ν…Œλ§ˆ μ μš©μ— 맀우 μœ μš©ν•˜λ©°, μŠ€νƒ€μΌμ΄ μ»΄ν¬λ„ŒνŠΈ 라이프사이클과 κ°•λ ₯ν•˜κ²Œ κ²°ν•©λ©λ‹ˆλ‹€ [9, 10]. ν•˜μ§€λ§Œ λΈŒλΌμš°μ €μ—μ„œ [[JavaScript|JavaScript]]λ₯Ό μ‹€ν–‰ν•΄ CSSλ₯Ό μƒμ„±ν•˜κ³  μ£Όμž…ν•˜κΈ° λ•Œλ¬Έμ— CPU μ‹€ν–‰ λΉ„μš©(λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œ)이 λ°œμƒν•˜λ©°, μ΄λŠ” λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ Œλ”λ§ μ§€μ—°(FID, INP μ €ν•˜)을 μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [9, 11-13]. λ˜ν•œ React Context에 μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— 기본적으둜 React Server Components(RSC) ν™˜κ²½κ³Ό ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ μžˆμ–΄, [[Next.js 15|Next.js 15]] ν™˜κ²½μ—μ„œλŠ” λ³„λ„μ˜ [[Style Registry|Style Registry]]λ₯Ό κ΅¬μΆ•ν•˜κ±°λ‚˜ v6.3.0λΆ€ν„° μ§€μ›λ˜λŠ” RSC μ „μš© κΈ°λŠ₯을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [14-17]. * **Tailwind CSS:** 미리 μ •μ˜λœ μœ ν‹Έλ¦¬ν‹° 클래슀λ₯Ό μ‘°ν•©ν•˜μ—¬ UIλ₯Ό κ΅¬μΆ•ν•˜λŠ” λ°©μ‹μœΌλ‘œ, JIT(Just-In-Time) 컴파일러λ₯Ό 톡해 μ‚¬μš©λœ 클래슀만 λΉŒλ“œ νƒ€μž„μ— 정적 CSS둜 μƒμ„±ν•©λ‹ˆλ‹€ [18, 19]. 이둜 인해 λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ 0에 μˆ˜λ ΄ν•˜λ©° λ²ˆλ“€ 크기가 맀우 μž‘κ³  RSC와 μ™„λ²½νžˆ ν˜Έν™˜λ©λ‹ˆλ‹€ [19-22]. μ΅œμ‹  Tailwind v4λŠ” JavaScript μ„€μ • 파일 λŒ€μ‹  `@theme` λ””λ ‰ν‹°λΈŒλ₯Ό μ΄μš©ν•œ 'CSS-first' μ•„ν‚€ν…μ²˜λ₯Ό λ„μž…ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ CSS λ³€μˆ˜ 기반의 λ””μžμΈ 토큰 관리λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€ [23-26]. * **λ””μžμΈ 토큰(Design Tokens)κ³Ό 동적 ν…Œλ§ˆ(Theming)** * λ””μžμΈ 토큰은 색상, νƒ€μ΄ν¬κ·Έλž˜ν”Ό, μ—¬λ°± λ“±μ˜ μ‹œκ°μ  λ””μžμΈ 결정을 μ½”λ“œν™”λœ 데이터(JSON, YAML)둜 쀑앙 μ§‘μ€‘ν™”ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€ [27, 28]. ν™•μž₯ κ°€λŠ₯ν•œ μ‹œμŠ€ν…œμ„ μœ„ν•΄ 토큰은 μ›μ‹œ 값인 **Base Tokens**(예: `#3366FF`), μ‚¬μš© λͺ©μ μ„ λ‚˜νƒ€λ‚΄λŠ” **Semantic Tokens**(예: `color.primary`), μ»΄ν¬λ„ŒνŠΈμ— 쒅속적인 **Component Tokens**(예: `button.background`)의 3κ³„μΈ΅μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€ [29-32]. * [[Style Dictionary|Style Dictionary]] λ“±μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜λ©΄ 토큰을 CSS λ³€μˆ˜(Custom Properties)둜 μžλ™ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [33-35]. 이λ₯Ό 톡해 React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ»΄ν¬λ„ŒνŠΈ μˆ˜μ • 없이 νŠΉμ • CSS 클래슀 λ³€κ²½λ§ŒμœΌλ‘œ 닀크 λͺ¨λ“œ λ“± 동적 ν…Œλ§ˆλ₯Ό μ›ν™œν•˜κ²Œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [36-38]. * **μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ 섀계 μ•„ν‚€ν…μ²˜** * **μ•„ν† λ―Ή λ””μžμΈ(Atomic Design):** UIλ₯Ό μ›μž(Atoms), λΆ„μž(Molecules), 유기체(Organisms), ν…œν”Œλ¦Ώ(Templates), νŽ˜μ΄μ§€(Pages) λ‹¨κ³„λ‘œ λΆ„ν•΄ν•˜μ—¬ μ‘°λ¦½ν•˜λŠ” 상ν–₯식 λ°©λ²•λ‘ μœΌλ‘œ, μ»΄ν¬λ„ŒνŠΈμ˜ 일관성과 μž¬μ‚¬μš©μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€ [3, 39, 40]. * **μ»΄νŒŒμš΄λ“œ μ»΄ν¬λ„ŒνŠΈ(Compound Components):** `Accordion.Header`, `Accordion.Body`처럼 μ—¬λŸ¬ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ React Contextλ₯Ό 톡해 μ•”λ¬΅μ μœΌλ‘œ μƒνƒœλ₯Ό κ³΅μœ ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€ [4, 5, 41]. 이 νŒ¨ν„΄μ€ μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ— μˆ˜λ§Žμ€ propsκ°€ λͺ°λ¦¬λŠ” ν˜„μƒ(prop soup)을 λ°©μ§€ν•˜κ³  μœ μ—°ν•œ λ ˆμ΄μ•„μ›ƒ ꡬ성을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€ [41-43]. * **[[Headless UI|Headless UI]]:** μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœ 관리, ν‚€λ³΄λ“œ λ‚΄λΉ„κ²Œμ΄μ…˜, ARIA 속성(μ ‘κ·Όμ„±) λ“± λΉ„μ¦ˆλ‹ˆμŠ€ 및 μƒν˜Έμž‘μš© 둜직만 μ œκ³΅ν•˜κ³  μ‹œκ°μ  μŠ€νƒ€μΌλ§μ€ μ™„μ „νžˆ κ°œλ°œμžμ—κ²Œ μœ„μž„ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€ [44-46]. Tailwind CSS와 κ²°ν•©ν•˜μ—¬ κ³ λ„μ˜ λ§žμΆ€ν˜• λ””μžμΈ μ‹œμŠ€ν…œμ„ ꡬ좕할 λ•Œ 널리 μ“°μž…λ‹ˆλ‹€ [44]. * **μ˜€λ²„λΌμ΄λ“œ νŒ¨ν„΄(Overrides API):** Uber의 Base Web λ“±μ—μ„œ μ±„νƒν•œ λ°©μ‹μœΌλ‘œ, μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ˜ κΉŠμ€ DOM μš”μ†ŒκΉŒμ§€ μ‹λ³„μžλ₯Ό 톡해 μŠ€νƒ€μΌμ΄λ‚˜ 속성, 심지어 λ‚΄λΆ€ μ»΄ν¬λ„ŒνŠΈ 자체λ₯Ό ν†΅μ§Έλ‘œ ꡐ체할 수 있게 ν—ˆμš©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈμ˜ ν™•μž₯성을 κ·ΉλŒ€ν™”ν•©λ‹ˆλ‹€ [47-49]. * **ν™•μž₯ κ°€λŠ₯ν•œ ν”„λ‘ νŠΈμ—”λ“œ ꡬ쑰와 [[Monorepo|Monorepo]]** * 쑰직 규λͺ¨κ°€ 컀질수둝 pnpm workspaces, [[Turborepo|Turborepo]], Nxλ₯Ό ν™œμš©ν•œ λͺ¨λ…Έλ ˆν¬(Monorepo) μ•„ν‚€ν…μ²˜κ°€ ν•„μˆ˜μ μž…λ‹ˆλ‹€ [50-52]. * FSD([[Feature-Sliced Design|Feature-Sliced Design]]) 방법둠을 λͺ¨λ…Έλ ˆν¬μ™€ κ²°ν•©ν•˜μ—¬, `shared`(μž¬μ‚¬μš© UI 및 토큰), `entities`(도메인 ꡬ쑰), `features`(λΉ„μ¦ˆλ‹ˆμŠ€ 둜직) λ“±μ˜ κ³„μΈ΅μœΌλ‘œ λ‚˜λˆ„κ³  각 νŒ¨ν‚€μ§€ κ°„μ˜ λͺ…μ‹œμ μΈ 곡개 API(Public API)λ§Œμ„ ν†΅ν•œ 톡신을 κ°•μ œν•¨μœΌλ‘œμ¨ μ˜μ‘΄μ„± μ—‰ν‚΄κ³Ό μŠ€νŒŒκ²Œν‹° μ½”λ“œλ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€ [53-56]. ## πŸ”— Knowledge Connections - **Related Topics:** [[CSS-in-JS|CSS-in-JS]], Tailwind CSS, Design Tokens, [[Atomic Design|Atomic Design]], Compound Components, [[Headless UI|Headless UI]], React Server Components, [[Feature-Sliced Design|Feature-Sliced Design]] - **Projects/Contexts:** [[Shopify Polaris|Shopify Polaris]], [[Uber Base Web|Uber Base Web]] - **Contradictions/Notes:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄ Styled Components λ“± CSS-in-JSλŠ” 동적 μŠ€νƒ€μΌλ§κ³Ό λŸ°νƒ€μž„ ν…Œλ§ˆ μ μš©μ— 맀우 κ°•λ ₯ν•˜μ§€λ§Œ, CSS 생성에 λ”°λ₯Έ λŸ°νƒ€μž„ μ„±λŠ₯ μ˜€λ²„ν—€λ“œμ™€ [[Next.js|Next.js]]의 React Server Components(RSC) ν™˜κ²½μ—μ„œμ˜ μ œμ•½(직접적인 Context μ‚¬μš© λΆˆκ°€)μ΄λΌλŠ” 단점이 μ‘΄μž¬ν•©λ‹ˆλ‹€ [7-9, 14]. 반면 Tailwind CSS와 같은 μœ ν‹Έλ¦¬ν‹° 퍼슀트 접근법은 λΉŒλ“œ νƒ€μž„μ— 정적 CSSλ₯Ό 생성해 λŸ°νƒ€μž„ λΆ€ν•˜κ°€ μ—†μœΌλ©° RSC와 μ™„λ²½νžˆ ν˜Έν™˜λ˜λ―€λ‘œ μ„±λŠ₯이 μ€‘μš”ν•œ λŒ€κ·œλͺ¨ 및 ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ λ”μš± μœ λ¦¬ν•˜λ‹€κ³  λŒ€μ‘°ν•˜μ—¬ μ„€λͺ…ν•©λ‹ˆλ‹€ [18, 19, 21, 57]. --- *Last updated: 2026-04-26*