# [[Reusable UI Components]] ## πŸ“Œ Brief Summary μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈλŠ” λ‹€μ–‘ν•œ ν”„λ‘œμ νŠΈμ™€ μ»¨ν…μŠ€νŠΈμ—μ„œ νœ΄λŒ€ κ°€λŠ₯(portable)ν•˜κ³ , 예츑 κ°€λŠ₯(predictable)ν•˜λ©°, λͺ…ν™•ν•œ λͺ©μ (purposeful)을 가지도둝 μ„€κ³„λœ ν”„λ‘ νŠΈμ—”λ“œμ˜ 핡심 ꡬ성 μš”μ†Œμž…λ‹ˆλ‹€ [1, 2]. μ΄λŠ” λ‹¨μˆœνžˆ μ½”λ“œμ˜ 양을 μ€„μ΄λŠ” 것이 μ•„λ‹ˆλΌ μš”κ΅¬μ‚¬ν•­μ˜ 변화에도 λ¬΄λ„ˆμ§€μ§€ μ•ŠλŠ” κ²¬κ³ ν•œ APIλ₯Ό μ„€κ³„ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€ [3]. 잘 μ„€κ³„λœ μ»΄ν¬λ„ŒνŠΈλŠ” νŒ€μ΄ 일관성 있고 접근성이 λ›°μ–΄λ‚˜λ©° ν™•μž₯ κ°€λŠ₯ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΉ λ₯΄κ²Œ 쑰립할 수 있게 ν•΄μ£ΌλŠ” '레고 ν‚€νŠΈ'와 같은 역할을 ν•©λ‹ˆλ‹€ [1]. ## πŸ“– Core μ†ŒμŠ€ Content - **μ„€κ³„μ˜ 4λŒ€ ν™©κΈˆ κ·œμΉ™ (Four Golden Rules):** μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλŠ” 단일 κΈ°λŠ₯만 μˆ˜ν–‰ν•˜λŠ” '단일 μ±…μž„(Single Responsibility)', 상속 λŒ€μ‹  μž‘μ€ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‘°ν•©ν•˜λŠ” 'ν•©μ„±(Composition Over Inheritance)', λͺ…ν™•ν•œ μž…λ ₯(props)κ³Ό 좜λ ₯(callbacks)을 κ°€μ§€λŠ” 'λͺ…μ‹œμ  계약(Explicit Contracts)', 그리고 슀크린 리더와 ν‚€λ³΄λ“œ 탐색 등을 기본적으둜 μ§€μ›ν•˜λŠ” 'μ ‘κ·Όμ„± μ΅œμš°μ„ (Accessibility First)' 원칙을 따라야 ν•©λ‹ˆλ‹€ [4]. - **API 및 μƒνƒœ 관리 (API Design & State Boundaries):** - 초기 μ»΄ν¬λ„ŒνŠΈ 섀계 μ‹œ 속성(Prop)μ—λ§Œ μ˜μ‘΄ν•˜λŠ” 방식(Prop-Driven)은 μš”κ΅¬μ‚¬ν•­μ΄ 증가함에 따라 Prop의 μˆ˜κ°€ κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ λŠ˜μ–΄λ‚˜κ³  μœ μ§€λ³΄μˆ˜μ„±μ„ νŒŒκ΄΄ν•˜λŠ” 원인이 λ©λ‹ˆλ‹€ [5-7]. - μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ˜ μƒνƒœλ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 μž¬μ‚¬μš©μ„±μ„ λ†’μž…λ‹ˆλ‹€ [8]. UI의 μ‹œκ°μ  μ„ΈλΆ€ 사항(예: 툴팁 ν† κΈ€)은 내뢀에 μœ μ§€ν•˜λ˜, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ΄λ‚˜ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈκ°€ μ‘°μœ¨ν•΄μ•Ό ν•˜λŠ” μƒνƒœλŠ” λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈ(μƒμœ„)둜 λŒμ–΄μ˜¬λ €μ•Ό ν•©λ‹ˆλ‹€ [8, 9]. - **μž¬μ‚¬μš©μ„±μ„ μœ„ν•œ μ£Όμš” μ•„ν‚€ν…μ²˜ νŒ¨ν„΄:** - **ν•©μ„± μ»΄ν¬λ„ŒνŠΈ (Compound Components):** λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ μ „μ—­ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κ³  ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈ(예: Accordion의 Header, Body)κ°€ ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ μƒνƒœλ₯Ό μ•”μ‹œμ μœΌλ‘œ κ³΅μœ ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ λ ˆμ΄μ•„μ›ƒ μ‘°ν•©μ˜ 자유λ₯Ό μ£ΌλŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€ [10-12]. - **ν—€λ“œλ¦¬μŠ€ μ»΄ν¬λ„ŒνŠΈ (Headless Components):** μƒνƒœ 관리, ν‚€λ³΄λ“œ 탐색, μ ‘κ·Όμ„± 둜직 λ“±λ§Œ μ œκ³΅ν•˜κ³  μ‹œκ°μ μΈ λ§ˆν¬μ—…(UI)은 μ „μ μœΌλ‘œ μ†ŒλΉ„μžμ—κ²Œ μœ„μž„ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€ [13-15]. - **λ Œλ” ν”„λ‘­μŠ€ (Render Props):** ν•¨μˆ˜λ₯Ό μžμ‹μ΄λ‚˜ prop으둜 μ „λ‹¬ν•˜μ—¬ λ Œλ”λ§ μ œμ–΄κΆŒμ„ λΆ€μ—¬ν•˜λŠ” νŒ¨ν„΄μœΌλ‘œ, APIλ₯Ό μ΄μ€‘μœΌλ‘œ λΆ„κΈ°ν•˜μ§€ μ•Šκ³ λ„ κ³ κΈ‰ μ‚¬μš©μžμ—κ²Œ μ œμ–΄κΆŒμ„ μ œκ³΅ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€ [16-18]. - **μ˜€λ²„λΌμ΄λ“œ νŒ¨ν„΄ (Overrides Pattern):** Uber의 Base Web λ“±μ—μ„œ μ‚¬μš©λ˜λ©°, λ‚΄λΆ€μ˜ 각 ν•˜μœ„ μš”μ†Œμ— μ‹λ³„μžλ₯Ό λΆ€μ—¬ν•΄ μ™ΈλΆ€μ—μ„œ νŠΉμ • μ†μ„±μ΄λ‚˜ μŠ€νƒ€μΌ, ν˜Ήμ€ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈ 자체λ₯Ό ν†΅μ§Έλ‘œ ꡐ체(override)ν•  수 있게 ν•©λ‹ˆλ‹€. μ΄λŠ” Prop의 λ‚¨μš©μ„ 막고 μ—£μ§€ μΌ€μ΄μŠ€ ν™•μž₯을 λ•μŠ΅λ‹ˆλ‹€ [19-22]. - **μ•„ν† λ―Ή λ””μžμΈ (Atomic Design):** UIλ₯Ό κΈ°λ³Έ λΉŒλ”© 블둝인 μ›μž(Atoms)λΆ€ν„° λΆ„μž(Molecules), 유기체(Organisms), ν…œν”Œλ¦Ώ(Templates), νŽ˜μ΄μ§€(Pages)둜 κ³„μΈ΅ν™”ν•˜μ—¬ 쑰립해 λ‚˜κ°€λŠ” λ°©λ²•λ‘ μž…λ‹ˆλ‹€ [23-25]. - **μŠ€νƒ€μΌλ§κ³Ό ν™•μž₯μ„±:** ν™•μž₯ κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ 라이브러리λ₯Ό μœ„ν•΄μ„œλŠ” 색상, νƒ€μ΄ν¬κ·Έλž˜ν”Ό λ“±μ˜ μ‹œκ°μ  속성을 ν•˜λ“œμ½”λ”©ν•˜μ§€ μ•Šκ³  λ””μžμΈ 토큰(Design Tokens)을 μ‚¬μš©ν•˜μ—¬ ν…Œλ§ˆ ν˜Έν™˜μ„±μ„ κ°–μΆ°μ•Ό ν•©λ‹ˆλ‹€ [9]. λ˜ν•œ, Tailwind CSS와 같은 μœ ν‹Έλ¦¬ν‹° 퍼슀트 ν”„λ ˆμž„μ›Œν¬ μ‚¬μš© μ‹œ CSS 클래슀 λ¬Έμžμ—΄μ΄ κΈΈμ–΄μ§€λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ°˜λ³΅λ˜λŠ” μŠ€νƒ€μΌ νŒ¨ν„΄μ„ μ»΄ν¬λ„ŒνŠΈλ‘œ μΆ”μΆœν•˜λŠ” 것이 ν•΅μ‹¬μž…λ‹ˆλ‹€ [26, 27]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Compound Components]], [[Design Tokens]], [[Atomic Design]], [[Headless Components]], [[Overrides Pattern]] - **Projects/Contexts:** [[Next.js App Router]] (μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ™€ ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§ 경계 관점), [[Shopify Polaris]] (μ ‘κ·Όμ„±κ³Ό 일관성이 높은 μ»΄ν¬λ„ŒνŠΈ 라이브러리 사둀), [[Uber Base Web]] (μ˜€λ²„λΌμ΄λ“œ νŒ¨ν„΄μ΄ κ΅¬ν˜„λœ λ””μžμΈ μ‹œμŠ€ν…œ 사둀) - **Contradictions/Notes:** μ†ŒμŠ€λŠ” Compound Component νŒ¨ν„΄μ΄ 맀우 κ°•λ ₯ν•œ μœ μ—°μ„±μ„ μ œκ³΅ν•œλ‹€κ³  μ„€λͺ…ν•˜μ§€λ§Œ, λ ˆμ΄μ•„μ›ƒμ΄ κ³ μ •λ˜μ–΄ μžˆκ±°λ‚˜ λ²„νŠΌ, μ•„μ΄μ½˜ 같은 λ‹¨μˆœν•œ μ»΄ν¬λ„ŒνŠΈμ—λŠ” λΆˆν•„μš”ν•œ 좔상화와 λ³΅μž‘μ„±μ„ μœ λ°œν•  수 μžˆμœΌλ―€λ‘œ κΈ°λ³Έκ°’μœΌλ‘œ κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 것은 ν”Όν•΄μ•Ό ν•œλ‹€κ³  κ²½κ³ ν•©λ‹ˆλ‹€ [28, 29]. λ˜ν•œ, Tailwind CSSμ—μ„œ μŠ€νƒ€μΌ μž¬μ‚¬μš©μ„ μœ„ν•΄ `@apply` μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  가급적 React μ»΄ν¬λ„ŒνŠΈλ‘œ μΆ”μƒν™”ν•˜λŠ” 것을 μš°μ„ μˆœμœ„λ‘œ ꢌμž₯ν•©λ‹ˆλ‹€ [27, 30]. --- *Last updated: 2026-04-26*