# [[Scalable Frontend Architecture]] ## ๐Ÿ“Œ Brief Summary ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜(Scalable Frontend Architecture)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ์™€ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋”๋ผ๋„ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„ฑ๋Šฅ, ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๊ตฌ์กฐ์  ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1-3]. ์ด๋ฅผ ์œ„ํ•ด ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ๋„๊ตฌ์™€ ๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„(Feature-Sliced Design, FSD), ์•„ํ† ๋ฏน ๋””์ž์ธ(Atomic Design) ๊ฐ™์€ ๋ฐฉ๋ฒ•๋ก ์„ ํ™œ์šฉํ•˜์—ฌ UI ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [3-6]. ๋”๋ถˆ์–ด, ๋””์ž์ธ ํ† ํฐ(Design Tokens)๊ณผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ํŒจํ„ด(์˜ˆ: Compound Components, Headless UI)์„ ๋„์ž…ํ•ด ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ณ , Tailwind CSS์™€ ๊ฐ™์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์šฐ์„ (Utility-first) ์Šคํƒ€์ผ๋ง์œผ๋กœ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ํ•ต์‹ฌ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [7-10]. ## ๐Ÿ“– Core Content * **๋ชจ๋“ˆํ™” ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (Monorepo & FSD):** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ˆ˜์˜ ์กฐ์ง์ด ์˜์กด์„ฑ ๊ด€๋ฆฌ์— ์œ ๋ฆฌํ•œ ๋ชจ๋…ธ๋ ˆํฌ(Turborepo, Nx, pnpm workspaces ๋“ฑ) ํ™˜๊ฒฝ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [3, 11]. ๋ชจ๋…ธ๋ ˆํฌ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” '๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„(Feature-Sliced Design, FSD)' ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ฒฐํ•ฉ๋  ๋•Œ ๊ฐ•๋ ฅํ•œ ํ™•์žฅ์„ฑ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค [3, 6]. FSD๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ Shared(์›์‹œ UI, ํ† ํฐ), Entities(๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ), Features(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง), Widgets, Pages์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ '๊ณต์œ (shared) ํด๋”'๊ฐ€ ๋‚œ์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ช…์‹œ์ ์ธ ๊ณต๊ฐœ API(Public API)๋งŒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [5, 12]. * **ํ™•์žฅ ๊ฐ€๋Šฅํ•œ UI ์ปดํฌ๋„ŒํŠธ ํŒจํ„ด:** ํ™•์žฅ์ด ์šฉ์ดํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single Responsibility)์„ ์ค€์ˆ˜ํ•˜๊ณ , ๋ถ€๋ชจ-์ž์‹ ๊ฐ„ ๋ช…์‹œ์  ๊ณ„์•ฝ์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด **์ปดํŒŒ์šด๋“œ ์ปดํฌ๋„ŒํŠธ(Compound Components)** ํŒจํ„ด์ด ๋„๋ฆฌ ์“ฐ์ด๋Š”๋ฐ, ์ด๋Š” ์—ฌ๋Ÿฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ(์˜ˆ: ํƒญ, ์•„์ฝ”๋””์–ธ)๊ฐ€ ํ•˜๋‚˜์˜ Context๋ฅผ ํ†ตํ•ด ์•”์‹œ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ํ•˜์—ฌ ๊ตฌ์„ฑ์˜ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [15-18]. ๋” ๋‚˜์•„๊ฐ€ ๋””์ž์ธ๊ณผ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•œ **ํ—ค๋“œ๋ฆฌ์Šค ์ปดํฌ๋„ŒํŠธ(Headless Components)** ํŒจํ„ด์€ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ ‘๊ทผ์„ฑ ๊ธฐ๋Šฅ๋งŒ์„ ์ œ๊ณตํ•˜๊ณ  ์Šคํƒ€์ผ๋ง ๊ถŒํ•œ์„ ์˜จ์ „ํžˆ ์†Œ๋น„์ž์—๊ฒŒ ์œ„์ž„ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [10, 19, 20]. ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ์›์ž(Atom)๋ถ€ํ„ฐ ํŽ˜์ด์ง€(Page) ๋‹จ์œ„๋กœ UI๋ฅผ ์กฐ๋ฆฝํ•ด ๋‚˜๊ฐ€๋Š” **์•„ํ† ๋ฏน ๋””์ž์ธ(Atomic Design)** ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ฒด๊ณ„์ ์ธ ๊ณ„์ธต์„ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 21, 22]. * **๋””์ž์ธ ํ† ํฐ(Design Tokens)๊ณผ ํ…Œ๋งˆ ํ™•์žฅ์„ฑ:** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ UI ์‹œ์Šคํ…œ์—์„œ๋Š” ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’ ๋Œ€์‹  ๋””์ž์ธ ํ† ํฐ์„ ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›(Single Source of Truth)์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [23, 24]. ํ† ํฐ์€ **์›์‹œ ํ† ํฐ(Primitive Tokens - ์˜ˆ: ์ƒ‰์ƒ ํ—ฅ์Šค ์ฝ”๋“œ), ์‹œ๋งจํ‹ฑ ํ† ํฐ(Semantic Tokens - ์˜ˆ: color.primary), ์ปดํฌ๋„ŒํŠธ ํ† ํฐ(Component Tokens)**์˜ 3๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [25-28]. Style Dictionary์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ JSON ๊ธฐ๋ฐ˜ ํ† ํฐ์„ CSS ๋ณ€์ˆ˜๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•ด React ์ปดํฌ๋„ŒํŠธ์— ์ ์šฉํ•˜๋ฉด, ๋‹คํฌ ๋ชจ๋“œ์™€ ๊ฐ™์€ ๋™์  ํ…Œ๋งˆ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ์†์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29-31]. * **์Šคํƒ€์ผ๋ง ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™”:** ์ตœ์‹  React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Next.js App Router ๋ฐ React Server Components ํ™˜๊ฒฝ)์—์„œ ์„ฑ๋Šฅ ํ™•์žฅ์„ ์œ„ํ•ด ์Šคํƒ€์ผ๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์ด Styled-components ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ CSS-in-JS์—์„œ Tailwind CSS ๋“ฑ์˜ ๋นŒ๋“œ ํƒ€์ž„(Build-time) ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [2, 32-34]. Tailwind CSS v4๋Š” `@theme` ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ๋„์ž…ํ•œ CSS ์šฐ์„ (CSS-first) ์•„ํ‚คํ…์ฒ˜์™€ CSS ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ(JavaScript ์‹คํ–‰ ๋น„์šฉ)๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ฝ”์–ด ์›น ๋ฐ”์ดํƒˆ(Core Web Vitals) ์„ฑ๋Šฅ์„ ๋น„์•ฝ์ ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [35-38]. ## ๐Ÿ”— Knowledge Connections - **Related Topics:** [[Monorepo Architecture]], [[Feature-Sliced Design (FSD)]], [[Atomic Design]], [[Compound Components]], [[Headless Components]], [[Design Tokens]], [[Tailwind CSS]], [[React Server Components (RSC)]], [[CSS-in-JS]] - **Projects/Contexts:** [[Next.js App Router]], [[Uber Base Web Design System]], [[Shopify Polaris]] - **Contradictions/Notes:** ์†Œ์Šค [9, 33, 34]์˜ ์•„ํ‹ฐํด๋“ค์€ Styled-components์™€ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ฐ˜ CSS-in-JS๊ฐ€ React Server Components(RSC) ํ™˜๊ฒฝ์—์„œ Context ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋กœ ์ธํ•ด ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ปค Tailwind CSS๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†Œ์Šค [39, 40]์˜ Styled-components ๊ณต์‹ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์— ๋”ฐ๋ฅด๋ฉด, v6.3.0 ์ด์ƒ๋ถ€ํ„ฐ๋Š” RSC ํ™˜๊ฒฝ์„ ์ž๋™ ๊ฐ์ง€ํ•˜์—ฌ `'use client'` ์ง€์‹œ์–ด ์—†์ด๋„ ์ธ๋ผ์ธ `