# [[Dynamic Theming|Dynamic Theming]] ## πŸ“Œ Brief Summary Dynamic Theming(동적 ν…Œλ§ˆ 적용)은 라이트 λͺ¨λ“œ/닀크 λͺ¨λ“œ λ˜λŠ” 닀쀑 λΈŒλžœλ“œ ν…Œλ§ˆμ™€ 같이 μ‚¬μš©μž μ„€μ •μ΄λ‚˜ μ»¨ν…μŠ€νŠΈμ— 따라 UI의 μ‹œκ°μ  속성을 λŸ°νƒ€μž„μ— μœ μ—°ν•˜κ²Œ μ „ν™˜ν•  수 μžˆλŠ” κΈ°λ²•μž…λ‹ˆλ‹€. μ΄λŠ” 주둜 λ””μžμΈ 토큰([[Design Tokens|Design Tokens]]), CSS λ³€μˆ˜(Custom Properties), λ˜λŠ” styled-components와 같은 [[CSS-in-JS|CSS-in-JS]] 라이브러리λ₯Ό ν™œμš©ν•˜μ—¬ κ΅¬ν˜„λ©λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈ μ½”λ“œμ˜ 직접적인 μˆ˜μ • 없이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ²΄μ˜ λ””μžμΈ μ‹œμŠ€ν…œμ„ 일관성 있고 ν™•μž₯ κ°€λŠ₯ν•˜κ²Œ κ΄€λ¦¬ν•˜λŠ” 데 ν•„μˆ˜μ μΈ 역할을 ν•©λ‹ˆλ‹€. ## πŸ“– Core Content * **λ””μžμΈ 토큰 기반의 ν…Œλ§ˆ μ „ν™˜ (Token Swapping):** 동적 ν…Œλ§ˆ κ΅¬ν˜„μ˜ 핡심은 단일 μ†ŒμŠ€μΈ λ””μžμΈ 토큰을 ν™œμš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. νŠΉμ • μ‹œλ§¨ν‹± 토큰(Semantic Token)이 ν…Œλ§ˆμ— 따라 λ‹€λ₯Έ μ°Έμ‘° κ°’([[Reference|Reference]] Value)을 가리킀도둝 μ„€μ •ν•©λ‹ˆλ‹€(예: 라이트 λͺ¨λ“œμ—μ„œλŠ” `color.background = ref.gray.100`, 닀크 λͺ¨λ“œμ—μ„œλŠ” `ref.gray.900`) [1]. Style Dictionary와 같은 도ꡬλ₯Ό ν™œμš©ν•˜λ©΄ [[Figma|Figma]] λ“±μ—μ„œ μ •μ˜λœ JSON ν˜•μ‹μ˜ 토큰을 CSS λ³€μˆ˜λ‚˜ React ν…Œλ§ˆ 객체둜 μžλ™ λ³€ν™˜ν•˜μ—¬ μ†μ‰½κ²Œ ν…Œλ§ˆ μ „μš© 좜λ ₯물을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€ [2-4]. * **CSS λ³€μˆ˜([[CSS Variables|CSS Variables]])λ₯Ό ν™œμš©ν•œ 동적 ν…Œλ§ˆ:** 졜적의 μ„±λŠ₯을 μœ„ν•΄ λ””μžμΈ 토큰을 CSS λ³€μˆ˜μ— λ§€ν•‘ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방식이 널리 μ“°μž…λ‹ˆλ‹€ [5]. ν…Œλ§ˆλ³„λ‘œ λ³„λ„μ˜ 토큰 μ„ΈνŠΈλ₯Ό μ •μ˜ν•˜κ³ (예: `light-theme.css`, `dark-theme.css`), λŸ°νƒ€μž„ μ‹œμ— `` λ˜λŠ” `` 같은 μ΅œμƒμœ„ μ»¨ν…Œμ΄λ„ˆμ— ν…Œλ§ˆ 클래슀λ₯Ό ν† κΈ€ν•˜μ—¬ μŠ€νƒ€μΌμ„ μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€ [5, 6]. 이 접근법은 κ°’λΉ„μ‹Ό 전체 λ¦¬λ Œλ”λ§(full re-render)을 μœ λ°œν•˜μ§€ μ•Šμ•„ λΆ€λ“œλŸ½κ³  λΉ λ₯Έ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€ [5, 7]. 졜근 [[Tailwind CSS v4|Tailwind CSS v4]]μ—μ„œλ„ `@theme` λ””λ ‰ν‹°λΈŒμ™€ CSS λ³€μˆ˜λ₯Ό ν™œμš©ν•΄ λ„€μ΄ν‹°λΈŒ μˆ˜μ€€μ˜ λŸ°νƒ€μž„ ν…Œλ§ˆ μ „ν™˜μ„ μ§κ΄€μ μœΌλ‘œ μ§€μ›ν•©λ‹ˆλ‹€ [8, 9]. * **React ν”„λ ˆμž„μ›Œν¬ 및 CSS-in-JS의 ν…Œλ§ˆ 적용:** `styled-components`λ‚˜ `Emotion` 같은 CSS-in-JS λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 기본적으둜 μ œκ³΅ν•˜λŠ” `ThemeProvider`λ₯Ό μ‚¬μš©ν•΄ React μ»΄ν¬λ„ŒνŠΈ νŠΈλ¦¬μ— λ™μ μœΌλ‘œ ν…Œλ§ˆλ₯Ό μ£Όμž…ν•  수 μžˆμ–΄ 닀쀑 ν…Œλ§ˆ κ΅¬ν˜„μ— 맀우 μš©μ΄ν•©λ‹ˆλ‹€ [10, 11]. λ˜ν•œ, `Chakra UI`λŠ” CSS-in-JSλ₯Ό 기반으둜 μ œμž‘λ˜μ–΄ λŸ°νƒ€μž„ μ‹œ 라이트/닀크 λͺ¨λ“œ 동적 μ „ν™˜μ„ μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ λ•μŠ΅λ‹ˆλ‹€ [12]. * **[[React Server Components (RSC)|React Server Components (RSC]] ν™˜κ²½μ—μ„œμ˜ μ œμ•½κ³Ό 해법:** Context 기반의 `ThemeProvider`λŠ” React Contextκ°€ μ—†λŠ” μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ(RSC) ν™˜κ²½μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠλŠ” 근본적인 ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€ [13-15]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ `styled-components` (v6.4 이상)λŠ” `createTheme` ν•¨μˆ˜λ₯Ό λ„μž…ν•˜μ—¬ 일반 ν…Œλ§ˆ 객체λ₯Ό CSS μ‚¬μš©μž μ •μ˜ 속성 μ°Έμ‘°(예: `var(--prefix-path)`)둜 λ³€ν™˜ν•©λ‹ˆλ‹€ [13]. 이 방식은 React Context에 μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ λͺ¨λ‘μ—μ„œ λ™μž‘ν•˜λ©°, 라이트/닀크 λͺ¨λ“œ μ „ν™˜ μ‹œ ν•˜μ΄λ“œλ ˆμ΄μ…˜([[Hydration|Hydration]]) λΆˆμΌμΉ˜λ‚˜ ν™”λ©΄ κΉœλΉ‘μž„(Flash)을 λ°©μ§€ν•©λ‹ˆλ‹€ [13, 16]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Design Tokens|Design Tokens]], CSS Variables, Styled Components, [[Tailwind CSS|Tailwind CSS]], [[React Server Components (RSC)|React Server Components (RSC]] - **Projects/Contexts:** [[Scalable Frontend Systems|Scalable FrontendSystems]], [[Component Library Architecture|Component Library Architecture]], Design-to-Code Workflow - **Contradictions/Notes:** CSS-in-JS 라이브러리의 `ThemeProvider`λŠ” 동적인 ν…Œλ§ˆ μ μš©μ— 맀우 μœ μš©ν•˜μ§€λ§Œ, [[Next.js|Next.js]]의 App Router와 같은 React Server Components(RSC) μ•„ν‚€ν…μ²˜μ™€λŠ” 본질적으둜 ν˜Έν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [14, 15]. μ΅œμ‹  ν™•μž₯μ„± 높은 ν”„λ‘ νŠΈμ—”λ“œ ν™˜κ²½μ—μ„œλŠ” μ΄λŸ¬ν•œ λŸ°νƒ€μž„ CSS-in-JS λŒ€μ‹  정적 μƒμ„±λœ CSS λ³€μˆ˜λ‚˜ Tailwind CSS, ν˜Ήμ€ 제둜 λŸ°νƒ€μž„ 라이브러리([[vanilla-extract|vanilla-extract]]) 기반의 ν…Œλ§ˆ μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [13, 15, 17, 18]. --- *Last updated: 2026-04-26*