# [[React Component Architecture|React Component Architecture]] ## ๐Ÿ“Œ Brief Summary React Component [[Architecture|Architecture]](๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜)๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋ฐฉ๋ฒ•๋ก  ๋ฐ ์„ค๊ณ„ ํŒจํ„ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„ํ‚คํ…์ฒ˜๋Š” ์•„ํ† ๋ฏน ๋””์ž์ธ(Atomic Design)๊ณผ ๊ฐ™์€ ์„ธ๋ถ„ํ™” ๊ธฐ์ค€์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณ„์ธต์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ์ปดํŒŒ์šด๋“œ ์ปดํฌ๋„ŒํŠธ(Compound Components)๋‚˜ ํ—ค๋“œ๋ฆฌ์Šค ์ปดํฌ๋„ŒํŠธ([[Headless Components|Headless Components]])์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ํ•ฉ์„ฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์Šคํƒ€์ผ๋ง์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค. ์ž˜ ์„ค๊ณ„๋œ ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜๋Š” ๋””์ž์ธ ํ† ํฐ([[Design Tokens|Design Tokens]])์˜ ์ ์šฉ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์— ๋ฐœ์ƒํ•˜๋Š” 'Prop ๋“œ๋ฆด๋ง' ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ์ผ๊ด€์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ## ๐Ÿ“– Core Content * **์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•œ ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™ (Foundational Rules):** ํšจ๊ณผ์ ์ธ ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜๋Š” ๋„ค ๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [1]. ์ฒซ์งธ, ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ ์ผ๋งŒ ์ž˜ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” '๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single Responsibility)'์ž…๋‹ˆ๋‹ค. ๋‘˜์งธ, '์ƒ์†๋ณด๋‹ค ํ•ฉ์„ฑ(Composition Over Inheritance)'์„ ํ†ตํ•ด ์ž‘์€ ๋ธ”๋ก์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์…‹์งธ, ๋ช…์‹œ์ ์ธ ๊ณ„์•ฝ(Explicit Contracts)์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ API(prop)๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ท์งธ, ์ ‘๊ทผ์„ฑ([[Accessibility|Accessibility]])์„ ์ตœ์šฐ์„ ์œผ๋กœ ๊ณ ๋ คํ•˜์—ฌ ํ‚ค๋ณด๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜์ด๋‚˜ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ง€์›์„ ๋‚ด์žฌํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. * **์•„ํ† ๋ฏน ๋””์ž์ธ ๋ฐฉ๋ฒ•๋ก  (Atomic Design):** UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์›์ž(Atoms), ๋ถ„์ž(Molecules), ์œ ๊ธฐ์ฒด(Organisms), ํ…œํ”Œ๋ฆฟ(Templates), ํŽ˜์ด์ง€(Pages)์˜ ๋‹ค์„ฏ ๋‹จ๊ณ„๋กœ ๋ถ„๋ฅ˜ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค [3, 4]. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ HTML ์š”์†Œ(๋ฒ„ํŠผ, ์ธํ’‹ ๋“ฑ)์ธ ์›์ž์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, ์ด๋“ค์„ ์กฐํ•ฉํ•œ ๋ถ„์ž(์˜ˆ: ๊ฒ€์ƒ‰ ํผ), ๋” ๋ณต์žกํ•œ ์œ ๊ธฐ์ฒด(์˜ˆ: ํ—ค๋”)๋กœ ํ™•์žฅํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค [5-7]. ์ด ๋ฐฉ๋ฒ•๋ก ์€ ๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜๊ณ , ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [8-10]. * **์ปดํŒŒ์šด๋“œ ์ปดํฌ๋„ŒํŠธ ํŒจํ„ด (Compound Components):** ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์— ์ˆ˜์‹ญ ๊ฐœ์˜ Prop์„ ์ฃผ์ž…ํ•˜๋Š” ๋Œ€์‹ (Prop-driven API), ์—ฌ๋Ÿฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด [[React Context|React Context]]๋ฅผ ํ†ตํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ ํ˜‘๋ ฅํ•˜๋Š” ํ•ฉ์„ฑ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [11-14]. ์˜ˆ๋ฅผ ๋“ค์–ด `Accordion.Root`, `Accordion.Item`, `Accordion.Header`, `Accordion.Body`์™€ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์†Œ๋น„์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๋ ˆ์ด์•„์›ƒ๊ณผ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [15, 16]. ์ด๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋ง ์œ ์—ฐ์„ฑ์ด ๊ทน๋Œ€ํ™”๋˜๊ณ  API๊ฐ€ ํ›จ์”ฌ ์„ ์–ธ์ ์ด๋ฉฐ ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค [13, 17]. * **ํ—ค๋“œ๋ฆฌ์Šค ์ปดํฌ๋„ŒํŠธ (Headless Components):** ์ƒํƒœ ๊ด€๋ฆฌ([[State|State]])๋‚˜ ์ ‘๊ทผ์„ฑ(Accessibility) ๊ฐ™์€ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ ๋™์ž‘๋งŒ์„ ์บก์Аํ™”ํ•˜์—ฌ ์ œ๊ณตํ•˜๋˜, ์‹œ๊ฐ์  ๋งˆํฌ์—…๊ณผ ์Šคํƒ€์ผ๋ง์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์™„์ „ํžˆ ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค [18, 19]. ๋ณต์žกํ•œ ์ปค์Šคํ…€ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ํ•„์ˆ˜์ ์ด๋ฉฐ, ํŠนํžˆ [[Tailwind CSS|Tailwind CSS]]์™€ ๊ฐ™์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์šฐ์„ (Utility-first) ์Šคํƒ€์ผ๋ง๊ณผ ๊ฒฐํ•ฉํ•  ๋•Œ ๊ฐ•๋ ฅํ•œ ์‹œ๋„ˆ์ง€๋ฅผ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค [18]. * **์˜ค๋ฒ„๋ผ์ด๋“œ ํŒจํ„ด ([[Overrides Pattern|Overrides Pattern]]):** Uber์˜ Base Web๊ณผ ๊ฐ™์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋””์ž์ธ ์‹œ์Šคํ…œ์—์„œ ํ™œ์šฉ๋˜๋Š” ํŒจํ„ด์œผ๋กœ, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋™์ž‘, ์ถ”๊ฐ€ Prop, ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ€์ผ์„ ํ†ต์งธ๋กœ ๋ฎ์–ด์“ฐ๊ฑฐ๋‚˜(Override) ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ๋œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [20-23]. ์ด๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘์ž๊ฐ€ ๋ชจ๋“  ์—ฃ์ง€ ์ผ€์ด์Šค(Edge Case)์— ๋Œ€๋น„ํ•˜์—ฌ ๊ฐœ๋ณ„ Prop์„ ๋งŒ๋“ค ํ•„์š” ์—†์ด('prop soup' ๋ฐฉ์ง€), ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊นŠ์€ ์ˆ˜์ค€์˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 23]. * **๋ชจ๋…ธ๋ ˆํฌ ๋ฐ [[Feature-Sliced Design|Feature-Sliced Design]] (FSD) ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜:** ์•ฑ์ด ํ™•์žฅ๋จ์— ๋”ฐ๋ผ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„˜์–ด ์•ฑ ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค [24]. ๋ชจ๋…ธ๋ ˆํฌ([[Turborepo|Turborepo]], Nx ๋“ฑ) ๋‚ด์—์„œ Feature-Sliced Design ๋ฐฉ๋ฒ•๋ก ์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ Shared(UI ์›์ž, ํ† ํฐ), Entities, Features, Widgets, Pages, App ๋ ˆ์ด์–ด๋กœ ๋‚˜๋ˆ„์–ด ๊ณ„์ธต ๊ฐ„ ์—„๊ฒฉํ•œ ์˜์กด์„ฑ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25]. ์ด๋Š” '๋ฌด๋ถ„๋ณ„ํ•œ ๊ณต์œ  ํด๋”' ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๋…๋ฆฝ์„ฑ๊ณผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ UI ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [9]. ## ๐Ÿ”— Knowledge Connections - **Related Topics:** [[Atomic Design|Atomic Design]], Compound Components, Headless Components, [[Design Tokens|Design Tokens]], [[Feature-Sliced Design (FSD)|Feature-Sliced Design (FSD]] - **Projects/Contexts:** [[Uber Base Web|Uber Base Web]], Shopify Polaris, Tailwind CSS, [[Styled Components|Styled Components]] - **Contradictions/Notes:** ์ปดํŒŒ์šด๋“œ ์ปดํฌ๋„ŒํŠธ ํŒจํ„ด์€ ๋›ฐ์–ด๋‚œ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ง€๋‚˜์นœ ์ž์œ ๋„(Too much freedom)๋กœ ์ธํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž„์˜๋กœ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ” UX์™€ ์ ‘๊ทผ์„ฑ์„ ํ›ผ์†ํ•  ์œ„ํ—˜์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [26]. ๋”ฐ๋ผ์„œ ๋ฒ„ํŠผ, ์•„์ด์ฝ˜, ๋ฐฐ์ง€ ๋“ฑ ๊ณ ์ •๋œ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ ๋‹จ์ˆœํ•œ ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ ์šฉ์„ ํ”ผํ•˜๊ณ (๋‹จ์ˆœํ•œ Prop ๋ฐฉ์‹์ด ๋” ์•ˆ์ „ํ•จ), ๋ ˆ์ด์•„์›ƒ ๋ณ€ํ˜•์ด ์žฆ์€ ๋ณต์žกํ•œ UI(ํƒญ, ๋ชจ๋‹ฌ, ์•„์ฝ”๋””์–ธ ๋“ฑ)์—๋งŒ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [27, 28]. --- *Last updated: 2026-04-26*