# [[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]], [[Atomic Design]], [[Design Tokens]], [[Tailwind CSS]], [[Styled Components]], [[React Server Components (RSC)]], [[Feature-Sliced Design (FSD)]]
- **Projects/Contexts:** [[Shopify Polaris]], [[Uber Base Web]], [[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*