# [[Component API Design|Component API Design]] ## ๐Ÿ“Œ Brief Summary ์ปดํฌ๋„ŒํŠธ API ๋””์ž์ธ(Component API Design)์€ ๊ฐœ๋ฐœ์ž๊ฐ€ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ตฌ์กฐ์  ์„ค๊ณ„์™€ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค[1-3]. ์ž˜ ์„ค๊ณ„๋œ ์ปดํฌ๋„ŒํŠธ API๋Š” ๊ณผ๋„ํ•œ Prop ์„ค์ •์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ํ•ฉ์„ฑ(Composition)์„ ํ™œ์šฉํ•˜์—ฌ ์†Œ๋น„์ž๊ฐ€ ์œ ์—ฐํ•˜๊ฒŒ UI๋ฅผ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค[2, 4]. ์ด๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ React ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค[1, 5, 6]. ## ๐Ÿ“– Core Content * **Prop-Driven API์˜ ํ•œ๊ณ„**: ์ปดํฌ๋„ŒํŠธ์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋™์ž‘์„ ์˜ค์ง ์ˆ˜๋งŽ์€ Prop(์˜ˆ: ๋‹ค์ˆ˜์˜ ๋ถˆ๋ฆฌ์–ธ ํ”Œ๋ž˜๊ทธ)์œผ๋กœ๋งŒ ์ œ์–ดํ•˜๋ ค ํ•˜๋ฉด, ๊ฐ Prop์ด ๊ฒฐํ•ฉ๋˜์–ด ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ณต์žกํ•ด์ง€๋Š” '๋ธ”๋ž™๋ฐ•์Šค'๊ฐ€ ํ˜•์„ฑ๋ฉ๋‹ˆ๋‹ค[4, 7, 8]. ์ด๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์„ ์œ ๋ฐœํ•˜๊ณ , ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์—๋„ ์‹œ์Šคํ…œ์ด ์‰ฝ๊ฒŒ ๊นจ์ง€๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค[4, 7]. * **๋ช…ํ™•ํ•œ ๊ณ„์•ฝ(Explicit Contracts) ๋ฐ Prop ์„ค๊ณ„**: ์ข‹์€ ์ปดํฌ๋„ŒํŠธ API๋Š” ์ง๊ด€์ ์ด๊ณ  ์˜ค์šฉํ•˜๊ธฐ ์–ด๋ ค์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค[3]. ๊ตฌํ˜„ ๋ฐฉ์‹์ด ์•„๋‹Œ ์‚ฌ์šฉ ๋ชฉ์ (intent)์— ๋”ฐ๋ผ Prop ์ด๋ฆ„์„ ์ง“๊ณ , Prop์˜ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ์„ค์ •(Prop Soup)์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค[3, 9]. ๋˜ํ•œ ์ดˆ๊ธฐ ์‚ฌ์šฉ์„ ์œ„ํ•ด ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’(Sensible Defaults)์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค[3, 10]. * **ํ•ฉ์„ฑ ๊ธฐ๋ฐ˜(Composition-Driven) ์‚ฌ๊ณ ์˜ ์ „ํ™˜**: "์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์•ผ ํ•˜๋Š”์ง€"๋ฅผ ์ง€์‹œํ•˜๋Š” ๋Œ€์‹ , ์ƒํƒœ์™€ ๊ทœ์น™๋งŒ ์ œ๊ณตํ•˜๊ณ  "๋ ˆ์ด์•„์›ƒ์€ ์†Œ๋น„์ž๊ฐ€ ์กฐ๋ฆฝ"ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๋ฉ˜ํƒˆ ๋ชจ๋ธ๋กœ์˜ ์ „ํ™˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค[2]. * **ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ฃผ์š” API ํŒจํ„ด**: * **๋ณตํ•ฉ ์ปดํฌ๋„ŒํŠธ ([[Compound Components|Compound Components]])**: `Accordion`, `Accordion.Item` ๋“ฑ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ [[React Context|React Context]]๋ฅผ ํ†ตํ•ด ์•”์‹œ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค[5, 11, 12]. ์ด ํŒจํ„ด์€ Prop ๋“œ๋ฆด๋ง์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ ์–ธ์ ์ด๋ฉฐ ์ฝ๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค[5, 11]. * **[[Render Props|Render Props]]**: ์‚ฌ์šฉ์ž์—๊ฒŒ ํŠน์ • UI ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๋Š” 'ํƒˆ์ถœ๊ตฌ(escape hatch)' ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ธฐ์กด API๋ฅผ ํ•ด์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค[13, 14]. * **์˜ค๋ฒ„๋ผ์ด๋“œ ํŒจํ„ด ([[Overrides Pattern|Overrides Pattern]])**: Uber์˜ Base Web ๋“ฑ์—์„œ ํ™œ์šฉ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ, `overrides` prop์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ํŠน์ • ํ•˜์œ„ ์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ์†์„ฑ, ์Šคํƒ€์ผ, ๋˜๋Š” ๋ Œ๋”๋ง ๋ฐฉ์‹ ์ „์ฒด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค[9, 15-17]. ์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด Prop์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค[17]. * **ํ—ค๋“œ๋ฆฌ์Šค ์ปดํฌ๋„ŒํŠธ ([[Headless Components|Headless Components]]) ๋ฐ ์Šฌ๋กฏ (Slots)**: UI ์Šคํƒ€์ผ๋ง ์—†์ด ์ƒํƒœ์™€ ๋™์ž‘ ๋กœ์ง๋งŒ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜(Headless), ์†Œ๋น„์ž๊ฐ€ ์ž์ฒด ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์˜๋„๋œ ์˜์—ญ(Slots)์„ ์ œ๊ณตํ•˜์—ฌ API์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค[8, 18]. ## ๐Ÿ”— Knowledge Connections - **Related Topics:** [[Compound Components|Compound Components]], Headless Components, Overrides Pattern, [[Prop Drilling|Prop Drilling]], [[Atomic Design|Atomic Design]] - **Projects/Contexts:** [[Uber Base Web|Uber Base Web]], Radix UI, [[Shopify Polaris|Shopify Polaris]] - **Contradictions/Notes:** ๋ณตํ•ฉ ์ปดํฌ๋„ŒํŠธ(Compound Components) ํŒจํ„ด์€ ๊ฐ•๋ ฅํ•œ ๊ตฌ์„ฑ์˜ ์ž์œ ๋„๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ง€๋‚˜์นœ ์ž์œ ๋กœ์›€์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆœ์„œ๋ฅผ ์ž„์˜๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ UX๋‚˜ ์ ‘๊ทผ์„ฑ์˜ ์ผ๊ด€์„ฑ์„ ํ•ด์น  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค[19, 20]. ๋”ฐ๋ผ์„œ ๋ฒ„ํŠผ์ด๋‚˜ ์•„์ด์ฝ˜๊ฐ™์ด ๋‹จ์ˆœํ•˜๊ณ  ๊ตฌ์กฐ๊ฐ€ ๊ณ ์ •๋œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ์ถ”์ƒํ™”๊ฐ€ ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ Prop-Driven ๋ฐฉ์‹์ด ๋” ์•ˆ์ „ํ•˜๊ณ  ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค[20, 21]. --- *Last updated: 2026-04-26*