# [[Public APIs|Public APIs]] ## πŸ“Œ Brief Summary ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ 및 μ»΄ν¬λ„ŒνŠΈ 라이브러리 μ„€κ³„μ—μ„œ 퍼블릭 API(Public APIs)λŠ” μ»΄ν¬λ„ŒνŠΈλ‚˜ νŒ¨ν‚€μ§€κ°€ 외뢀와 μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•΄ λ…ΈμΆœν•˜λŠ” λͺ…μ‹œμ μΈ κ³„μ•½μ΄μž μ•ˆμ •μ μΈ μ§„μž…μ (entry point)을 μ˜λ―Έν•©λ‹ˆλ‹€ [1, 2]. μ΄λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ λ°›λŠ” 속성(props)κ³Ό λ°˜ν™˜ν•˜λŠ” 이벀트(callbacks)λ₯Ό μ •μ˜ν•˜λ©°, λ‚΄λΆ€ κ΅¬ν˜„ μ„ΈλΆ€ 사항을 μΊ‘μŠν™”ν•©λ‹ˆλ‹€ [2]. λͺ…ν™•ν•œ 퍼블릭 APIλ₯Ό κ°•μ œν•˜λŠ” 것은 νŒ¨ν‚€μ§€ κ°„μ˜ λ¬΄λΆ„λ³„ν•œ μ°Έμ‘°λ₯Ό λ°©μ§€ν•˜κ³ , λ³€ν™”ν•˜λŠ” μš”κ΅¬μ‚¬ν•­ μ†μ—μ„œλ„ μ•ˆμ „ν•˜κ²Œ ν™•μž₯ κ°€λŠ₯ν•œ UIλ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [3, 4]. ## πŸ“– Core Content * **μ»΄ν¬λ„ŒνŠΈ API μ„€κ³„μ˜ μ€‘μš”μ„±:** μž¬μ‚¬μš© κ°€λŠ₯ν•œ UIλ₯Ό κ΅¬μΆ•ν•˜λŠ” 것은 λ‹¨μˆœνžˆ μ½”λ“œλ₯Ό 적게 μž‘μ„±ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 지속적인 λ³€ν™”μ—μ„œ 살아남을 수 μžˆλŠ” APIλ₯Ό μ„€κ³„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ [3]. 쒋은 μ»΄ν¬λ„ŒνŠΈ APIλŠ” 직관적이고 μ˜€μš©ν•˜κΈ° μ–΄λ €μ›Œμ•Ό ν•˜λ©°, μ΅œμ†Œν•œμ˜ 속성(props)만 λ…ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€ [5]. μ΄λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ 무엇을 받아듀이고, 무엇을 λ°˜ν™˜ν•˜λ©°, μ ˆλŒ€ ν•˜μ§€ 말아야 ν•  행동(예: λΆ€λͺ¨ μƒνƒœ 변이)을 κ·œμ •ν•˜λŠ” λͺ…μ‹œμ  계약(Explicit Contracts) 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€ [2]. * **λͺ¨λ…Έλ ˆν¬μ™€ νŒ¨ν‚€μ§€ 경계 관리:** λŒ€κ·œλͺ¨ λͺ¨λ…Έλ ˆν¬ ν™˜κ²½μ—μ„œλŠ” λͺ¨λ“ˆμ„± μœ μ§€λ₯Ό μœ„ν•΄ μ—„κ²©ν•œ 퍼블릭 API λ…ΈμΆœμ΄ ν•„μš”ν•©λ‹ˆλ‹€ [1, 4]. μ†ŒλΉ„μžλŠ” λ‚΄λΆ€μ˜ κΉŠμ€ 경둜(예: `import Button from "@acme/ui/src/button/Button"`)κ°€ μ•„λ‹Œ, μ˜λ„μ μœΌλ‘œ λ…ΈμΆœλœ μ•ˆμ •μ μΈ μ§„μž…μ (예: `import { Button } from "@acme/ui"`)을 ν†΅ν•΄μ„œλ§Œ λͺ¨λ“ˆμ„ 가져와야 ν•©λ‹ˆλ‹€ [4]. 이λ₯Ό κ°•μ œν•˜κΈ° μœ„ν•΄ νŒ¨ν‚€μ§€μ˜ `package.json`μ—μ„œ `exports` ν•„λ“œλ₯Ό μ •μ˜ν•˜κ±°λ‚˜ [[ESLint|ESLint]] κ·œμΉ™μ„ μ μš©ν•˜μ—¬ λ”₯ μž„ν¬νŠΈ(deep imports)λ₯Ό 차단해야 ν•©λ‹ˆλ‹€ [4, 6]. * **FSD([[Feature-Sliced Design|Feature-Sliced Design]])μ™€μ˜ 톡합:** ν™•μž₯ κ°€λŠ₯ν•œ ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ 방법둠인 FSDλŠ” 슬라이슀(slice) κ²½κ³„μ—μ„œ λͺ…μ‹œμ μΈ 퍼블릭 API μ‚¬μš©μ„ ꢌμž₯ν•©λ‹ˆλ‹€ [7]. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 곡유 νŒ¨ν‚€μ§€λ‚˜ 슬라이슀의 `index.ts` 같은 퍼블릭 API νŒŒμΌμ„ ν†΅ν•΄μ„œλ§Œ μž„ν¬νŠΈν•˜κ³ , λ‚΄λΆ€ νŒŒμΌμ€ μ² μ €νžˆ 내뢀에 μœ μ§€λ˜λ„λ‘ μ„€κ³„ν•¨μœΌλ‘œμ¨ μ˜λ„μΉ˜ μ•Šμ€ κ²°ν•©(accidental coupling)을 크게 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€ [7, 8]. * **κ±°λ²„λ„ŒμŠ€ 및 λΈŒλ ˆμ΄ν‚Ή 체인지 λ°©μ§€:** μ—¬λŸ¬ μ•±μ—μ„œ μ‚¬μš©λ˜λŠ” 곡유 νŒ¨ν‚€μ§€(예: `packages/ui`)의 퍼블릭 APIκ°€ 변경될 경우 νŒŒκΈ‰ νš¨κ³Όκ°€ ν¬λ―€λ‘œ, 예츑 λΆˆκ°€λŠ₯ν•œ μ‹œμŠ€ν…œ 쀑단을 막기 μœ„ν•΄ μ—„κ²©ν•œ 관리가 ν•„μš”ν•©λ‹ˆλ‹€ [9, 10]. `CODEOWNERS` 등을 μ΄μš©ν•΄ μ†Œμœ κΆŒμ„ λͺ…ν™•νžˆ ν•˜κ³ , 곡유 λͺ¨λ“ˆμ˜ 퍼블릭 API에 λ³€κ²½ 사항이 μžˆμ„ λ•ŒλŠ” λ°˜λ“œμ‹œ μ½”λ“œ 리뷰λ₯Ό μš”κ΅¬ν•˜λŠ” 정책을 μˆ˜λ¦½ν•΄μ•Ό ν•©λ‹ˆλ‹€ [9, 10]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Component API Design|Component API Design]], Monorepo Architecture, [[Feature-Sliced Design (FSD)|Feature-Sliced Design (FSD]], Explicit Contracts - **Projects/Contexts:** λŒ€κ·œλͺ¨ λ¦¬μ•‘νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λͺ¨λ…Έλ ˆν¬ ꡬ좕(Nx/[[Turborepo|Turborepo]]), ν™•μž₯ κ°€λŠ₯ν•˜κ³  μœ μ§€λ³΄μˆ˜ μš©μ΄ν•œ μž¬μ‚¬μš© UI μ»΄ν¬λ„ŒνŠΈ 라이브러리 섀계 - **Contradictions/Notes:** μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ˜ λ³΅μž‘μ„±μ€ 숨기고 μ™ΈλΆ€λ‘œλŠ” λ‹¨μˆœν•˜κ³  μΌκ΄€λœ μ§„μž…μ μ„ μ œκ³΅ν•΄μ•Ό ν•œλ‹€λŠ” 원칙은, 단일 μ»΄ν¬λ„ŒνŠΈ 섀계와 λŒ€κ·œλͺ¨ νŒ¨ν‚€μ§€ ꡬ쑰 섀계 μ–‘μͺ½ λͺ¨λ‘μ— κ³΅ν†΅μ μœΌλ‘œ 핡심적인 μ§€μΉ¨μœΌλ‘œ κ°•μ‘°λ©λ‹ˆλ‹€ [2, 4]. --- *Last updated: 2026-04-26*