# [[Building Reusable UI Components]] ## πŸ“Œ Brief Summary μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈλŠ” μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ™€ μœ„μΉ˜μ—μ„œ μ½”λ“œλ₯Ό 크게 μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆλŠ” 독립적이고 이식성(Portable)κ³Ό 예츑 κ°€λŠ₯μ„±(Predictable)이 λ›°μ–΄λ‚œ UI ꡬ성 μš”μ†Œμž…λ‹ˆλ‹€ [1]. μ΄λŠ” 단일 μ±…μž„μ„ κ°€μ§€λ©° λͺ…ν™•ν•œ API(Props)와 μ ‘κ·Όμ„±(Accessibility)을 κ°–μΆ”μ–΄ ν™•μž₯ κ°€λŠ₯ν•˜κ³  일관성 μžˆλŠ” λ””μžμΈ μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜λŠ” 핡심 역할을 ν•©λ‹ˆλ‹€ [2, 3]. μ΅œμ‹  React μƒνƒœκ³„μ—μ„œλŠ” λ³΅μž‘μ„±μ„ 쀄이기 μœ„ν•΄ λ‹¨μˆœν•œ Prop 전달을 λ„˜μ–΄μ„œ, μ»΄νŒŒμš΄λ“œ μ»΄ν¬λ„ŒνŠΈλ‚˜ ν—€λ“œλ¦¬μŠ€ μ»΄ν¬λ„ŒνŠΈμ™€ 같은 κ³ κΈ‰ ν•©μ„± νŒ¨ν„΄μ„ ν™œμš©ν•˜μ—¬ μž¬μ‚¬μš©μ„±μ„ κ·ΉλŒ€ν™”ν•©λ‹ˆλ‹€ [4, 5]. ## πŸ“– Core Content * **μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈμ˜ 4κ°€μ§€ 핡심 원칙 (Four Golden Rules)**: * **단일 μ±…μž„ (Single Responsibility):** 각 μ»΄ν¬λ„ŒνŠΈλŠ” ν•œ κ°€μ§€ κΈ°λŠ₯만 잘 μˆ˜ν–‰ν•˜λ„λ‘ λ§Œλ“€μ–΄ 버그λ₯Ό 쀄이고 μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬μ•Ό ν•©λ‹ˆλ‹€ [3]. * **상속보닀 ν•©μ„± (Composition Over Inheritance):** 의견이 배제된(unopinionated) κΈ°λ³Έ μ»΄ν¬λ„ŒνŠΈλ“€μ„ λΈ”λ‘μ²˜λŸΌ μ‘°λ¦½ν•˜μ—¬ 더 큰 μ»΄ν¬λ„ŒνŠΈλ₯Ό ꡬ성해야 ν•©λ‹ˆλ‹€ [3]. * **λͺ…ν™•ν•œ 계약 (Explicit Contracts):** μ»΄ν¬λ„ŒνŠΈκ°€ λ°›λŠ” κ°’(Props)κ³Ό λ°˜ν™˜ν•˜λŠ” 이벀트(Callbacks)의 APIλ₯Ό λͺ…ν™•νžˆ μ •μ˜ν•˜μ—¬ λΆ€μž‘μš©μ„ λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [3, 6]. * **μ ‘κ·Όμ„± μš°μ„  (Accessibility First):** ν‚€λ³΄λ“œ λ‚΄λΉ„κ²Œμ΄μ…˜, ARIA μ—­ν• (Roles), 포컀슀 관리 λ“± 슀크린 리더 및 λͺ¨λ“  μ‚¬μš©μžλ₯Ό μœ„ν•œ 접근성을 기본적으둜 λ‚΄μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€ [3, 7]. * **μƒνƒœ 관리 및 API 섀계 (State Boundaries & API Design)**: * Prop 기반의 APIλŠ” μš”κ΅¬μ‚¬ν•­μ΄ λŠ˜μ–΄λ‚ μˆ˜λ‘ μˆ˜λ§Žμ€ μƒνƒœ λ³€μˆ˜(Prop Soup)λ₯Ό λ°œμƒμ‹œμΌœ ν™•μž₯을 μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€ [6, 8]. μ˜λ„μ— λ§žλŠ” Prop 이름을 μ‚¬μš©ν•˜κ³  μ•ˆμ „ν•œ κΈ°λ³Έκ°’(Defaults)을 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€ [6]. * 툴팁 ν† κΈ€κ³Ό 같은 둜컬 UI μƒνƒœλŠ” μ»΄ν¬λ„ŒνŠΈ 내뢀에 μœ μ§€ν•˜λ˜, ν•„ν„°λ§μ΄λ‚˜ 데이터 호좜과 같은 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ μƒμœ„ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈλ‘œ μ˜¬λ €μ•Ό(Push up) μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€ [9]. * **μž¬μ‚¬μš©μ„±μ„ κ·ΉλŒ€ν™”ν•˜λŠ” κ³ κΈ‰ React νŒ¨ν„΄ (Scalable Component Patterns)**: * **μ»΄νŒŒμš΄λ“œ μ»΄ν¬λ„ŒνŠΈ (Compound Components):** μ•„μ½”λ””μ–Έ(Accordion)μ΄λ‚˜ νƒ­(Tabs)처럼 μ—¬λŸ¬ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ Contextλ₯Ό 톡해 μ•”μ‹œμ μœΌλ‘œ μƒνƒœλ₯Ό κ³΅μœ ν•˜λ„λ‘ κ΅¬μ„±ν•˜μ—¬, μ†ŒλΉ„μžκ°€ λ ˆμ΄μ•„μ›ƒμ„ μœ μ—°ν•˜κ²Œ μ œμ–΄ν•  수 있게 ν•©λ‹ˆλ‹€ [10-12]. * **ν—€λ“œλ¦¬μŠ€ μ»΄ν¬λ„ŒνŠΈ (Headless Components):** μ‹œκ°μ μΈ λ§ˆν¬μ—…(UI) 없이 μƒνƒœμ™€ λ™μž‘ 둜직만 μ œκ³΅ν•˜μ—¬, λ””μžμΈ μ‹œμŠ€ν…œκ³Ό λ¬΄κ΄€ν•˜κ²Œ μ ‘κ·Όμ„± λ†’κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€ [13-15]. * **λ Œλ” ν”„λ‘­μŠ€ (Render Props):** ν•¨μˆ˜λ₯Ό μžμ‹ μš”μ†Œλ‘œ μ „λ‹¬ν•˜μ—¬ λ‘œμ§μ„ κ³΅μœ ν•˜κ³  λ Œλ”λ§μ— λŒ€ν•œ μ™„μ „ν•œ μ œμ–΄κΆŒμ„ μ‚¬μš©μžμ—κ²Œ λΆ€μ—¬ν•©λ‹ˆλ‹€ [15, 16]. * **슬둯 및 μ˜μ—­ (Slots / Regions):** μ†ŒλΉ„μžκ°€ 직접 μ½˜ν…μΈ λ₯Ό λΌμ›Œ 넣을 수 μžˆλŠ” μ˜λ„μ μΈ 빈 곡간(예: 헀더, ν‘Έν„°)을 μ œκ³΅ν•˜μ—¬ Prop의 κ³ΌλΆ€ν•˜λ₯Ό λ§‰μŠ΅λ‹ˆλ‹€ [14]. * **μŠ€νƒ€μΌλ§κ³Ό ν…Œλ§ˆ 적용 (Styling & Theming)**: * μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλŠ” ν•˜λ“œμ½”λ”©λœ μŠ€νƒ€μΌμ„ ν”Όν•˜κ³ , μƒ‰μƒμ΄λ‚˜ 간격 λ“±μ˜ λ””μžμΈ 토큰(Design Tokens)을 기반으둜 λΈŒλžœλ“œμ˜ 룩을 상속받아야 ν•©λ‹ˆλ‹€ [17]. * ꡬ쑰λ₯Ό μΊ‘μŠν™”ν•˜λ©΄μ„œλ„ 클래슀 μ΄λ¦„μ΄λ‚˜ μŠ€νƒ€μΌ Prop을 μ£Όμž…ν•  수 μžˆλŠ” 훅을 λ…ΈμΆœν•˜μ—¬, μ½”λ“œλ₯Ό 포크(Fork)ν•˜μ§€ μ•Šκ³ λ„ μ—¬λŸ¬ μ œν’ˆ μŠ€ν‚¨μ΄λ‚˜ 닀크 λͺ¨λ“œ ν…Œλ§ˆμ— μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•˜λ„λ‘ 섀계해야 ν•©λ‹ˆλ‹€ [17, 18]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Compound Components]], [[Headless Components]], [[Atomic Design]], [[Design Tokens]] - **Projects/Contexts:** [[Shopify Polaris]] (μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈμ™€ 접근성을 μ œκ³΅ν•˜μ—¬ μΌκ΄€λœ μ•± UIλ₯Ό κ΅¬μΆ•ν•˜λŠ” μ‡Όν”ΌνŒŒμ΄μ˜ λ””μžμΈ μ‹œμŠ€ν…œ [19, 20]), [[Uber Base Web]] (λ‹€μ–‘ν•œ μš”κ΅¬μ‚¬ν•­μ— λŒ€μ‘ν•˜κΈ° μœ„ν•΄ λͺ¨λ“  ν•˜μœ„ μš”μ†Œμ˜ μŠ€νƒ€μΌκ³Ό κΈ°λŠ₯을 μ œμ–΄ν•  수 μžˆλŠ” 'Overrides' νŒ¨ν„΄μ„ κ΅¬ν˜„ν•œ React μ»΄ν¬λ„ŒνŠΈ 라이브러리 사둀 [21, 22]) - **Contradictions/Notes:** μ»΄νŒŒμš΄λ“œ μ»΄ν¬λ„ŒνŠΈλŠ” λ›°μ–΄λ‚œ λ ˆμ΄μ•„μ›ƒ κ΅¬μ„±μ˜ μžμœ λ„λ₯Ό μ œκ³΅ν•˜μ§€λ§Œ [10], μ§€λ‚˜μΉœ μžμœ λ„λŠ” UX 일관성을 ν•΄μΉ  수 있으며, λ‹¨μˆœν•˜κ³  ꡬ쑰가 κ³ μ •λœ μ»΄ν¬λ„ŒνŠΈ(예: λ²„νŠΌ, μ•„μ΄μ½˜)에 μ‚¬μš©ν•  경우 λΆˆν•„μš”ν•œ 좔상화와 μœ μ§€λ³΄μˆ˜ λΉ„μš©λ§Œ μ¦κ°€μ‹œν‚€κ²Œ λ˜λ―€λ‘œ 상황에 맞게 μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [23-25]. --- *Last updated: 2026-04-26*