# [[Reusable UI Component Libraries|Reusable UI Component Libraries]] ## πŸ“Œ Brief Summary μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈ(Reusable UI Component) λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν˜„λŒ€ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΌˆλŒ€ 역할을 ν•˜λŠ” '레고 블둝'κ³Ό 같은 μš”μ†Œλ‘œ, 이식성(Portable)κ³Ό 예츑 κ°€λŠ₯μ„±(Predictable), 그리고 λͺ©μ μ„±(Purposeful)을 갖좔도둝 μ„€κ³„λ©λ‹ˆλ‹€ [1, 2]. 잘 μ„€κ³„λœ μ»΄ν¬λ„ŒνŠΈ μ‹œμŠ€ν…œμ€ μΌκ΄€λœ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•˜κ³  개발 μ‹œκ°„μ„ λ‹¨μΆ•ν•˜λ©°, 단일 μ±…μž„ 원칙과 λ””μžμΈ 토큰 기반의 μœ μ—°ν•œ μŠ€νƒ€μΌλ§μ„ 톡해 ν™•μž₯ κ°€λŠ₯ν•˜κ³  μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 핡심적인 역할을 ν•©λ‹ˆλ‹€ [1, 3-6]. ## πŸ“– Core Content **1. μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈμ˜ 4κ°€μ§€ 핡심 원칙** * **단일 μ±…μž„ 원칙 (Single Responsibility):** 각 μ»΄ν¬λ„ŒνŠΈλŠ” ν•œ κ°€μ§€ λͺ©μ λ§Œ 잘 μˆ˜ν–‰ν•΄μ•Ό ν•˜λ©°, κ΄€λ ¨ μ—†λŠ” λ³΅μž‘ν•œ 둜직(예: λ³΅μž‘ν•œ 데이터 페칭 λ“±)을 μ§Šμ–΄μ Έμ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€ [4, 7]. * **상속보닀 ν•©μ„± (Composition Over Inheritance):** 의견이 배제된(unopinionated) μž‘μ€ κΈ°λ³Έ μ»΄ν¬λ„ŒνŠΈλ“€μ„ ν•©μ„±ν•˜μ—¬ 더 큰 ꡬ쑰λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€ [4]. * **λͺ…μ‹œμ  계약 (Explicit Contracts):** μž…λ ₯(props)κ³Ό 좜λ ₯(callbacks/events)을 λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜κ³ , μ„€μ • λ²”μœ„λ₯Ό μ΅œμ†Œν™”ν•˜μ—¬ 잘λͺ» μ‚¬μš©ν•  μ—¬μ§€λ₯Ό 쀄여야 ν•©λ‹ˆλ‹€(prop soup μ§€μ–‘) [4, 8]. * **μ ‘κ·Όμ„± μš°μ„  (Accessibility First):** ν‚€λ³΄λ“œ 탐색, νƒ­ μˆœμ„œ, μ˜¬λ°”λ₯Έ ARIA μ—­ν•  및 슀크린 리더 지원이 기본적으둜 λ‚΄μž₯λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [4, 9]. **2. μƒνƒœ 관리 및 API 섀계** * μ»΄ν¬λ„ŒνŠΈμ˜ APIλŠ” μ‚¬μš© λͺ©μ μ„ λͺ…ν™•νžˆ λ“œλŸ¬λ‚΄λŠ” μ΄λ¦„μœΌλ‘œ κ΅¬μ„±λ˜μ–΄μ•Ό ν•˜λ©°, 합리적인 κΈ°λ³Έκ°’(Sensible Defaults)을 μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€ [8]. * λ‚΄λΆ€ μƒνƒœ(Internal State)λŠ” 툴팁 ν‘œμ‹œμ™€ 같은 κ΅­μ†Œμ μΈ UI μƒνƒœλ‘œ μ œν•œν•΄μ•Ό ν•©λ‹ˆλ‹€. λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ΄λ‚˜ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‘°μ ˆν•΄μ•Ό ν•˜λŠ” μƒνƒœλŠ” λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈλ‘œ λŒμ–΄μ˜¬λ¦¬κ³ (State Hoisting), μ½œλ°±μ„ 톡해 λ³€κ²½ 사항을 μ•Œλ €μ•Ό ν•©λ‹ˆλ‹€ [10]. **3. ν™•μž₯ κ°€λŠ₯ν•œ μ•„ν‚€ν…μ²˜ νŒ¨ν„΄** * **볡합 μ»΄ν¬λ„ŒνŠΈ (Compound Components):** `Accordion.Item`, `Accordion.Header`와 같이 μ—¬λŸ¬ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ React Contextλ₯Ό 톡해 μ•”μ‹œμ μœΌλ‘œ μƒνƒœλ₯Ό κ³΅μœ ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€. λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ³Όλ„ν•˜κ²Œ Prop을 λ‚΄λ €λ³΄λ‚΄λŠ”(Prop drilling) 문제λ₯Ό ν•΄κ²°ν•˜κ³  맀우 μœ μ—°ν•œ ꡬ성을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€ [11-13]. * **ν—€λ“œλ¦¬μŠ€ μ»΄ν¬λ„ŒνŠΈ (Headless Components):** UI λ§ˆν¬μ—…μ΄λ‚˜ μŠ€νƒ€μΌλ§μ„ λ°°μ œν•˜κ³  μƒνƒœ 및 λ™μž‘ 둜직만 μ œκ³΅ν•˜λŠ” νŒ¨ν„΄μœΌλ‘œ, 높은 μ»€μŠ€ν„°λ§ˆμ΄μ§•μ΄ ν•„μš”ν•  λ•Œ μ΄μƒμ μž…λ‹ˆλ‹€ [14, 15]. * **μ˜€λ²„λΌμ΄λ“œ νŒ¨ν„΄ (Overrides Pattern):** νŠΉμ • μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ˜ ν•˜μœ„ μš”μ†Œλ“€μ„ μ‹λ³„μžλ₯Ό 톡해 λ…ΈμΆœν•˜μ—¬, μ‚¬μš©μžκ°€ μ‰½κ²Œ 좔가적인 μ†μ„±μ΄λ‚˜ μŠ€νƒ€μΌμ„ μ£Όμž…ν•˜κ±°λ‚˜ μš”μ†Œλ₯Ό ν†΅μ§Έλ‘œ ꡐ체할 수 있게 ν•˜λŠ” API 섀계 λ°©μ‹μž…λ‹ˆλ‹€(예: Uber의 Base Web) [16-18]. * **μ•„ν† λ―Ή λ””μžμΈ (Atomic Design):** UIλ₯Ό μ›μž(Atoms), λΆ„μž(Molecules), 유기체(Organisms), ν…œν”Œλ¦Ώ(Templates), νŽ˜μ΄μ§€(Pages) λ‹¨μœ„λ‘œ μ μ§„μ μœΌλ‘œ κ²°ν•©ν•˜μ—¬ κ΅¬μ„±ν•˜λŠ” λ°©λ²•λ‘ μœΌλ‘œ μ‹œκ°μ  일관성을 λ†’μž…λ‹ˆλ‹€ [19-21]. **4. μŠ€νƒ€μΌλ§ 및 λ””μžμΈ 토큰 톡합** * λΈŒλžœλ“œμ˜ 룩앀필을 ν•˜λ“œμ½”λ”©ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ **λ””μžμΈ 토큰(Design Tokens)**(색상, 간격, νƒ€μ΄ν¬κ·Έλž˜ν”Ό)을 μ‚¬μš©ν•˜μ—¬ μŠ€νƒ€μΌμ„ ꡬ성해야 ν•©λ‹ˆλ‹€ [5]. * 3λ‹¨κ³„μ˜ 토큰 계측(Base/Primitive, Semantic, Component-specific)을 ν™œμš©ν•˜κ³  이λ₯Ό CSS λ³€μˆ˜λ‘œ λ³€ν™˜ν•˜λ©΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν…Œλ§ˆ(라이트/닀크 λͺ¨λ“œ λ“±)λ₯Ό μ»΄ν¬λ„ŒνŠΈ μˆ˜μ • 없이 λ™μ μœΌλ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [22-25]. * κΈ°μˆ μ μœΌλ‘œλŠ” λŸ°νƒ€μž„ λΉ„μš©μ΄ μ—†λŠ” Tailwind CSS 기반의 μœ ν‹Έλ¦¬ν‹° 방식이 높은 μ„±λŠ₯을 λ‚΄λ©° [26, 27], Styled-Components와 같은 CSS-in-JSλŠ” μ»΄ν¬λ„ŒνŠΈ 레벨의 동적 μŠ€νƒ€μΌλ§μ— κ°•λ ₯ν•˜μ§€λ§Œ μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§ ν™˜κ²½μ—μ„œλŠ” λ³΅μž‘μ„±μ΄ 좔가될 수 μžˆμŠ΅λ‹ˆλ‹€ [28, 29]. **5. ν™•μž₯ κ°€λŠ₯ν•œ ν”„λ‘ νŠΈμ—”λ“œ 인프라 (λͺ¨λ…Έλ ˆν¬)** * μ»΄ν¬λ„ŒνŠΈ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ—¬λŸ¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 곡유될 λ•Œ, **λͺ¨λ…Έλ ˆν¬(Monorepo)**(예: pnpm workspaces, Turborepo, Nx) μ•„ν‚€ν…μ²˜λ₯Ό λ„μž…ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [30-32]. * FSD(Feature-Sliced Design) μ•„ν‚€ν…μ²˜ 방법둠을 ν•¨κ»˜ λ„μž…ν•˜μ—¬ κΈ°λŠ₯(Feature)μ΄λ‚˜ 곡유 μ›μ‹œ μ»΄ν¬λ„ŒνŠΈ(Shared) 사이에 λ”₯ μž„ν¬νŠΈ(deep imports)λ₯Ό κΈˆμ§€ν•˜κ³  λͺ…ν™•ν•œ Public API μΈν„°νŽ˜μ΄μŠ€ κ·œμΉ™μ„ κ°•μ œν•΄μ•Ό λͺ¨λ“ˆμ˜ 응집도λ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [33, 34]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Compound Components|Compound Components]], [[Atomic Design|Atomic Design]], [[Design Tokens|Design Tokens]], [[Tailwind CSS|Tailwind CSS]], [[Styled Components|Styled Components]], [[React Server Components (RSC)|React Server Components (RSC)]], [[Feature-Sliced Design (FSD)|Feature-Sliced Design (FSD)]] - **Projects/Contexts:** [[Shopify Polaris|Shopify Polaris]], [[Uber Base Web|Uber Base Web]], [[Radix UI|Radix UI]] - **Contradictions/Notes:** - 볡합 μ»΄ν¬λ„ŒνŠΈ(Compound Components) νŒ¨ν„΄μ€ 쑰립의 μžμœ λ„λ₯Ό κ·ΉλŒ€ν™”ν•˜μ§€λ§Œ 둜직이 μ—¬λŸ¬ μ»¨ν…μŠ€νŠΈ 및 Render Props에 λΆ„μ‚°λ˜μ–΄ 디버깅이 μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ ˆμ΄μ•„μ›ƒμ΄ κ³ μ •λ˜μ–΄ μžˆκ±°λ‚˜ λ²„νŠΌ, λ°°μ§€μ²˜λŸΌ λ‹¨μˆœν•œ μš”μ†Œμ— λ„μž…ν•˜λŠ” 것은 κ³Όλ„ν•œ 좔상화(Over-engineering)κ°€ λ˜λ―€λ‘œ ν”Όν•΄μ•Ό ν•©λ‹ˆλ‹€ [35-37]. - Tailwind CSS(μœ ν‹Έλ¦¬ν‹° 퍼슀트)와 Styled-Components(CSS-in-JS)λŠ” μŠ€νƒ€μΌλ§ νŒ¨λŸ¬λ‹€μž„ μΈ‘λ©΄μ—μ„œ μΆ©λŒν•©λ‹ˆλ‹€. TailwindλŠ” λΉŒλ“œ μ‹œμ μ— 정적 CSSλ₯Ό 생성해 React Server Components(RSC) ν™˜κ²½ 및 μ„±λŠ₯ μ΅œμ ν™”μ— λ›°μ–΄λ‚˜μ§€λ§Œ JSX λ§ˆν¬μ—…μ΄ μ§€μ €λΆ„ν•΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€ [38-40]. 반면 Styled-ComponentsλŠ” ν›Œλ₯­ν•œ μΊ‘μŠν™”μ™€ 동적 Prop μŠ€νƒ€μΌλ§μ„ μ œκ³΅ν•˜μ§€λ§Œ λŸ°νƒ€μž„ μ‹œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰μœΌλ‘œ μΈν•œ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜λ©°, RSC ν™˜κ²½μ„ μ˜¨μ „νžˆ μ§€μ›ν•˜κΈ° μœ„ν•΄ λ³„λ„μ˜ μŠ€νƒ€μΌ λ ˆμ§€μŠ€νŠΈλ¦¬ νŒ¨ν„΄ 섀정이 κ°•μ œλ©λ‹ˆλ‹€ [40-43]. --- *Last updated: 2026-04-26*