# best styling approach in React projects styled-components vs tailwind pros cons how to build reusable UI components React Design Tokens implementation example Component Library Architecture React how to structure UI components scalable frontend ## πŸ“Œ Brief Summary ν˜„λŒ€μ˜ ν™•μž₯ κ°€λŠ₯ν•œ React ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜λŠ” λŸ°νƒ€μž„ μ„±λŠ₯ μ΅œμ ν™”μ™€ 개발자 κ²½ν—˜(DX) κ°„μ˜ κ· ν˜•μ„ λ§žμΆ”λŠ” 것이 ν•΅μ‹¬μž…λ‹ˆλ‹€. μŠ€νƒ€μΌλ§ νŒ¨λŸ¬λ‹€μž„μ€ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ μ‘΄μž¬ν•˜λŠ” Styled-components 같은 [[CSS-in-JS|CSS-in-JS]] λ°©μ‹μ—μ„œ μ„±λŠ₯이 λ›°μ–΄λ‚˜κ³  React Server Components(RSC)와 ν˜Έν™˜λ˜λŠ” Tailwind CSS와 같은 μœ ν‹Έλ¦¬ν‹° μš°μ„ (Utility-first) λ°©μ‹μœΌλ‘œ μ΄λ™ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 성곡적인 UI μ‹œμŠ€ν…œμ„ μœ„ν•΄μ„œλŠ” 볡합 μ»΄ν¬λ„ŒνŠΈ([[Compound Components|Compound Components]]) νŒ¨ν„΄κ³Ό ν—€λ“œλ¦¬μŠ€(Headless) UIλ₯Ό ν™œμš©ν•˜μ—¬ μœ μ—°ν•œ μž¬μ‚¬μš©μ„±μ„ 확보해야 ν•˜λ©°, λ””μžμΈ 토큰(Design Tokens)κ³Ό λͺ¨λ…Έλ ˆν¬(Monorepo) 및 [[Feature-Sliced Design|Feature-Sliced Design]](FSD) 같은 ꡬ쑰적 방법둠을 톡해 λŒ€κ·œλͺ¨ ν”„λ‘ νŠΈμ—”λ“œ ν™˜κ²½μ—μ„œ 일관성과 μœ μ§€λ³΄μˆ˜μ„±μ„ κ°•μ œν•΄μ•Ό ν•©λ‹ˆλ‹€. ## πŸ“– Core Content **1. μŠ€νƒ€μΌλ§ νŒ¨λŸ¬λ‹€μž„: Styled-components vs Tailwind CSS** * **Styled-components (CSS-in-JS):** μ»΄ν¬λ„ŒνŠΈ μ€‘μ‹¬μ˜ μŠ€νƒ€μΌλ§κ³Ό Propsλ₯Ό ν™œμš©ν•œ 동적 μŠ€νƒ€μΌλ§μ— 맀우 μœ λ¦¬ν•˜λ©° 개발자 κ²½ν—˜μ΄ λ›°μ–΄λ‚©λ‹ˆλ‹€ [1]. κ·ΈλŸ¬λ‚˜ λŸ°νƒ€μž„μ— CSS λ¬Έμžμ—΄μ„ μƒμ„±ν•˜κ³  μ£Όμž…ν•΄μ•Ό ν•˜λ―€λ‘œ CPU μžμ›μ„ μ†Œλͺ¨ν•˜λ©° λ²ˆλ“€ 크기λ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€ [1-3]. 특히 [[React Context|React Context]]에 μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— Next.js App Router와 같은 React [[Server Components|Server Components]](RSC) ν™˜κ²½μ—μ„œλŠ” 직접적인 μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜λ©° ν•˜μ΄λ“œλ ˆμ΄μ…˜ 뢈일치 μœ„ν—˜μ΄ λ”°λ¦…λ‹ˆλ‹€ [2, 4-6]. * **Tailwind CSS:** μœ ν‹Έλ¦¬ν‹° 클래슀λ₯Ό μ‘°ν•©ν•˜μ—¬ λΉ λ₯΄κ³  μΌκ΄€λœ λ””μžμΈμ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [7]. **λΉŒλ“œ νƒ€μž„μ— μ‚¬μš©λœ CSS만 μ •μ μœΌλ‘œ μƒμ„±ν•˜μ—¬ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ μ—†κΈ° λ•Œλ¬Έμ—, 초기 λ Œλ”λ§(LCP λ“±)κ³Ό μƒν˜Έμž‘μš© 속도(INP) λ“± [[Core Web Vitals|Core Web Vitals]] μ΅œμ ν™”μ— νƒμ›”ν•œ μ„±λŠ₯**을 λ³΄μ—¬μ€λ‹ˆλ‹€ [3, 8-10]. λ§ˆν¬μ—…μ΄ μž₯ν™©ν•΄μ§€λŠ” 단점이 μžˆμœΌλ‚˜, μΌκ΄€λœ μ»΄ν¬λ„ŒνŠΈ 좔상화λ₯Ό 톡해 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [11-13]. **2. ν™•μž₯ κ°€λŠ₯ν•˜κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈ 섀계** * **핡심 원칙:** μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλŠ” 단일 μ±…μž„ 원칙을 λ”°λ₯΄κ³ , μƒμ†λ³΄λ‹€λŠ” ν•©μ„±(Composition)을 μš°μ„ ν•΄μ•Ό ν•˜λ©°, λͺ…μ‹œμ μΈ API 계약(Props)κ³Ό μ ‘κ·Όμ„±([[Accessibility|Accessibility]])을 기본으둜 κ°–μΆ”μ–΄μ•Ό ν•©λ‹ˆλ‹€ [14]. * **Compound Components (볡합 μ»΄ν¬λ„ŒνŠΈ):** `Tabs`, `Accordion`κ³Ό 같이 μ—¬λŸ¬ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ Contextλ₯Ό 톡해 μ•”μ‹œμ μœΌλ‘œ μƒνƒœλ₯Ό κ³΅μœ ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€ [15-18]. 이 νŒ¨ν„΄μ€ κ³Όλ„ν•œ Prop 전달([[Prop Drilling|Prop Drilling]])을 막고, μ†ŒλΉ„μžκ°€ UI ꡬ쑰λ₯Ό 자유둭게 ꡬ성할 수 μžˆλŠ” ν›Œλ₯­ν•œ μœ μ—°μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€ [19-21]. * **[[Headless Components|Headless Components]] & [[Overrides Pattern|Overrides Pattern]]:** λ§ˆν¬μ—…μ΄λ‚˜ μŠ€νƒ€μΌ 없이 둜직과 μƒνƒœ κ΄€λ¦¬λ§Œ μ œκ³΅ν•˜λŠ” ν—€λ“œλ¦¬μŠ€ UIλ₯Ό μ‚¬μš©ν•˜λ©΄ μ™„λ²½ν•œ μŠ€νƒ€μΌ μ œμ–΄κΆŒμ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€ [21, 22]. λ˜ν•œ Uber의 Base Web μ‹œμŠ€ν…œμ²˜λŸΌ `overrides` prop을 λ…ΈμΆœν•˜λ©΄ 라이브러리λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ ν•˜μœ„ μš”μ†Œμ˜ λ Œλ”λ§μ΄λ‚˜ μŠ€νƒ€μΌμ„ 깊이 있게 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [23-25]. **3. React λ””μžμΈ 토큰(Design Tokens)의 κ΅¬ν˜„** * **ν† ν°μ˜ 계측화:** λ””μžμΈ 토큰은 색상, νƒ€μ΄ν¬κ·Έλž˜ν”Ό, 간격 등을 쀑앙 μ§‘μ€‘ν™”ν•˜μ—¬ 일관성을 보μž₯ν•©λ‹ˆλ‹€ [26, 27]. ν™•μž₯성을 μœ„ν•΄ 토큰을 μ›μ‹œ 값을 μ˜λ―Έν•˜λŠ” κΈ°λ³Έ 토큰(Primitive Tokens), λ§₯락을 λ‚˜νƒ€λ‚΄λŠ” μ‹œλ§¨ν‹± 토큰(Semantic Tokens, 예: `color-background-primary`), 그리고 νŠΉμ • UI에 μ’…μ†λœ μ»΄ν¬λ„ŒνŠΈ ν† ν°μœΌλ‘œ 계측화해야 ν•©λ‹ˆλ‹€ [28-31]. * **도ꡬ 및 동적 ν…Œλ§ˆ κ΅¬ν˜„:** [[Style Dictionary|Style Dictionary]]λ₯Ό μ‚¬μš©ν•˜μ—¬ JSON 파일의 토큰을 ν”Œλž«νΌλ³„ ν¬λ§·μ΄λ‚˜ CSS λ³€μˆ˜λ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [32-34]. 특히, Tailwind CSS v4λŠ” `@theme` μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ CSS λ³€μˆ˜λ‘œ λ””μžμΈ 토큰을 μ •μ˜ν•˜λ―€λ‘œ, [[JavaScript|JavaScript]] μ„€μ • 없이도 λ„€μ΄ν‹°λΈŒ μ›Ή ν”Œλž«νΌ λ°©μ‹μ˜ λŸ°νƒ€μž„ ν…Œλ§ˆ μ „ν™˜(라이트/닀크 λͺ¨λ“œ λ“±)을 μš°μˆ˜ν•˜κ²Œ μ§€μ›ν•©λ‹ˆλ‹€ [35-38]. **4. μ»΄ν¬λ„ŒνŠΈ 라이브러리 μ•„ν‚€ν…μ²˜ 및 ν”„λ‘ νŠΈμ—”λ“œ ꡬ쑰화** * **[[Atomic Design|Atomic Design]] (μ•„ν† λ―Ή λ””μžμΈ):** UIλ₯Ό μ›μž(Atoms), λΆ„μž(Molecules), 유기체(Organisms), ν…œν”Œλ¦Ώ, νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ λ‚˜λˆ„λŠ” λ°©λ²•λ‘ μœΌλ‘œ, μ»΄ν¬λ„ŒνŠΈλ₯Ό μ„ΈλΆ„ν™”ν•˜μ—¬ λ””μžμΈ μ‹œμŠ€ν…œ λ‚΄μ˜ μ‹œκ°μ  μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬μ€λ‹ˆλ‹€ [39-41]. * **Monorepo와 [[Feature-Sliced Design (FSD)|Feature-Sliced Design (FSD]]:** ν”„λ‘ νŠΈμ—”λ“œ 규λͺ¨κ°€ 컀지면 [[Turborepo|Turborepo]], Nx, pnpm workspacesλ₯Ό μ΄μš©ν•œ λͺ¨λ…Έλ ˆν¬(Monorepo) ꡬ쑰가 μœ λ¦¬ν•©λ‹ˆλ‹€ [42, 43]. 여기에 Feature-Sliced Design (FSD) μ•„ν‚€ν…μ²˜λ₯Ό κ²°ν•©ν•˜μ—¬ μ½”λ“œλ² μ΄μŠ€λ₯Ό 곡유(Shared), μ—”ν‹°ν‹°(Entities), κΈ°λŠ₯(Features), μœ„μ ―, νŽ˜μ΄μ§€λ‘œ λ‚˜λˆ„λ©΄ 도메인 κ°„μ˜ μ˜μ‘΄μ„±μ„ μ—„κ²©ν•˜κ²Œ 단방ν–₯으둜 ν†΅μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [44, 45]. * **곡용 API ([[Public APIs|Public APIs]]) κ°•μ œ:** μž¬μ‚¬μš© κ°€λŠ₯ν•œ νŒ¨ν‚€μ§€λŠ” 항상 `index.ts` λ“± λͺ…μ‹œμ μΈ μ§„μž…μ μ„ ν†΅ν•΄μ„œλ§Œ λͺ¨λ“ˆμ„ λ…ΈμΆœν•˜κ³ , "κΉŠμ€ 경둜 μ°Έμ‘°(Deep imports)"λ₯Ό μ°¨λ‹¨ν•˜μ—¬ 예기치 μ•Šμ€ μ‹œμŠ€ν…œ κ²°ν•©κ³Ό μŠ€νŒŒκ²Œν‹° μ½”λ“œλ₯Ό λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [46, 47]. ## πŸ”— Knowledge Connections - **Related Topics:** [[React Server Components (RSC)|React Server Components (RSC]], Compound Components Pattern, Headless UI, [[Design Tokens|Design Tokens]], Atomic Design, [[Monorepo Architecture|Monorepo Architecture]], [[Feature-Sliced Design (FSD)|Feature-Sliced Design (FSD]] - **Projects/Contexts:** [[Next.js App Router Migration|Next.js App Router Migration]], Tailwind CSS v4 CSS-first Architecture, [[Uber Base Web Design System|Uber Base Web Design System]] - **Contradictions/Notes:** Tailwind CSSλŠ” 클래슀λͺ… λ‚˜μ—΄λ‘œ 인해 λ§ˆν¬μ—…μ΄ μž₯ν™©ν•΄μ§€κ³  디버깅이 κΉŒλ‹€λ‘œμ›Œμ§€λŠ” 단점(Class soup)이 μžˆμ§€λ§Œ, μ»΄ν¬λ„ŒνŠΈ 좔상화λ₯Ό 톡해 이λ₯Ό 극볡할 수 μžˆμŠ΅λ‹ˆλ‹€. 반면 Styled-componentsλŠ” μ»΄ν¬λ„ŒνŠΈ μˆ˜μ€€μ˜ μΊ‘μŠν™”κ°€ ν›Œλ₯­ν•˜μ§€λ§Œ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ 컀 μ„±λŠ₯(특히 λŒ€κ·œλͺ¨ λ Œλ”λ§ 및 LCP, INP λ“±μ˜ Core Web Vitals)이 μ €ν•˜λ˜κ³  [[React 19|React 19]]의 μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ(RSC) ν™˜κ²½μ— μ ν•©ν•˜μ§€ μ•Šμ•„, λŒ€κ·œλͺ¨ μ•±μ΄λ‚˜ λͺ¨λ˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” Tailwind λ˜λŠ” Zero-runtime CSS 방식이 더 μΆ”μ²œλ˜λŠ” μΆ”μ„Έμž…λ‹ˆλ‹€ [2, 3, 5, 8, 10, 11]. --- *Last updated: 2026-04-26*