API Design on C++

TL;DR

  • API๋Š” ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์™€์˜ ๊ณ„์•ฝ(contract) ์ด๋‹ค

  • ์ข‹์€ API๋Š” ์กด์žฌ๊ฐ์ด ์—†๊ณ , ๋‚˜์œ API๋Š” ์ง€์†์ ์ธ ๊ณ ํ†ต์„ ์ค€๋‹ค

  • Top-down(์‚ฌ์šฉ์ž ์ค‘์‹ฌ) ์„ค๊ณ„๊ฐ€ ๊ฑฐ์˜ ํ•ญ์ƒ ์ •๋‹ต์ด๋‹ค

  • API๋Š” ์„ฑ๊ณตํ• ์ˆ˜๋ก ๋ณ€๊ฒฝ ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค

  • ๊ตฌํ˜„ ๋””ํ…Œ์ผ์ด API๋กœ ์ƒˆ๋Š” ์ˆœ๊ฐ„, ๋ฏธ๋ž˜์˜ ์„ ํƒ์ง€๋Š” ์‚ฌ๋ผ์ง„๋‹ค


๊ฐœ์š” (Overview)

์ด ๊ฐ•์—ฐ์€ โ€œAPI๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?โ€๋ผ๋Š” ์งˆ๋ฌธ์„
๋ฌธ๋ฒ•์ด๋‚˜ ์Šคํƒ€์ผ์ด ์•„๋‹Œ ํ˜„์‹ค์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๊ด€์ ์—์„œ ๋‹ค๋ฃฌ๋‹ค.

ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€๋Š” ๋‹จ ํ•˜๋‚˜๋‹ค.

API ์„ค๊ณ„์˜ ์ถœ๋ฐœ์ ์€
โ€˜๋ฉ‹์ง„ ๊ตฌํ˜„โ€™์ด ์•„๋‹ˆ๋ผ โ€˜์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€โ€™๋‹ค.

๊ฐ•์—ฐ์€ ๋‹ค์Œ ์งˆ๋ฌธ๋“ค์— ๋‹ตํ•œ๋‹ค.

  • ์ข‹์€ API์™€ ๋‚˜์œ API์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€?

  • ์™œ ์‚ฌ์šฉ์ž ๊ด€์ (top-down)์ด ์ค‘์š”ํ•œ๊ฐ€?

  • API๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์™œ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š”๊ฐ€?

  • API/ABI ํ˜ธํ™˜์„ฑ์€ ์„ค๊ณ„์— ์–ด๋–ค ์ œ์•ฝ์„ ์ฃผ๋Š”๊ฐ€?

  • ์‹ค๋ฌด์—์„œ API๋ฅผ ํ‰๊ฐ€ํ•  ๋•Œ ๋ฌด์—‡์„ ๋ด์•ผ ํ•˜๋Š”๊ฐ€?


์ƒ์„ธ ์„ค๋ช… (Detailed Breakdown)

1. ์ข‹์€ API์™€ ๋‚˜์œ API

์ข‹์€ API์˜ ํŠน์ง•

  • ์‚ฌ์šฉ์ž๊ฐ€ API์˜ ์กด์žฌ๋ฅผ ์˜์‹ํ•˜์ง€ ์•Š๋Š”๋‹ค

  • ๋„๋ฉ”์ธ ์ง€์‹๋งŒ์œผ๋กœ ์ง๊ด€์ ์ธ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

  • ์ˆ˜๋…„์—์„œ ์ˆ˜์‹ญ ๋…„๊นŒ์ง€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

  • ๋ณ€๊ฒฝ์ด ์ ๊ณ , ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฃผ๋Š” ์ถฉ๊ฒฉ์ด ์ž‘๋‹ค

  • ํ…Œ์ŠคํŠธ, ์„ฑ๋Šฅ, ํ™•์žฅ์„ฑ์— ๊ธ์ •์ ์œผ๋กœ ๊ธฐ์—ฌํ•œ๋‹ค

์ข‹์€ API๋Š” โ€œ์ข‹๋‹คโ€๋Š” ๋А๋‚Œ์กฐ์ฐจ ๋“ค์ง€ ์•Š๋Š”๋‹ค


๋‚˜์œ API์˜ ํŠน์ง•

  • ํ”Œ๋žซํผ ๋˜๋Š” ๊ตฌํ˜„ ๋””ํ…Œ์ผ์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋œ๋‹ค

  • ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค

  • ์˜ค์šฉ(misuse)ํ•˜๊ธฐ ์‰ฝ๋‹ค

  • ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๊ณ  ๋ฒ„๊ทธ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค

  • deprecate โ†’ ์ƒˆ API โ†’ ๋˜ deprecate์˜ ๋ฐ˜๋ณต

๋‚˜์œ API๋Š” ํ•œ ๋ฒˆ ์“ฐ๊ณ  ๋๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ง€์†์ ์ธ ๊ณ ํ†ต์„ ์ค€๋‹ค


2. API ์„ค๊ณ„ ์ฒ ํ•™: Top-down vs Bottom-up

Top-down ์„ค๊ณ„ (๊ถŒ์žฅ)

  1. ์‚ฌ์šฉ์ž ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋จผ์ € ์ •์˜ํ•œ๋‹ค

  2. ์˜ˆ์ œ ์ฝ”๋“œ์™€ ๋ฌธ์„œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ๋‹ค

  3. API๋ฅผ ์ •์˜ํ•œ๋‹ค

  4. ๋งˆ์ง€๋ง‰์— ๊ตฌํ˜„ํ•œ๋‹ค

โ†’ API๊ฐ€ ๊ตฌํ˜„์˜ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด๋กœ ๋งํ•˜๊ฒŒ ๋œ๋‹ค


Bottom-up ์„ค๊ณ„ (์œ„ํ—˜)

  • ๊ตฌํ˜„(์•Œ๊ณ ๋ฆฌ์ฆ˜, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค

  • API๊ฐ€ ๊ตฌํ˜„์— ๋Œ๋ ค๋‹ค๋‹Œ๋‹ค

๋ฌธ์ œ์ :

  • ๊ตฌํ˜„ ๋””ํ…Œ์ผ์ด API๋กœ ๊ทธ๋Œ€๋กœ ์ƒˆ์–ด๋‚˜์˜จ๋‹ค

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•Œ์•„์•ผ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

  • ํ…Œ์ŠคํŠธ, ํ™•์žฅ, ๊ต์ฒด๊ฐ€ ๋ชจ๋‘ ์–ด๋ ค์›Œ์ง„๋‹ค


3. API ์‚ฌ์šฉ์ž ๊ทœ๋ชจ์™€ ๋ณ€๊ฒฝ ๋น„์šฉ

์‚ฌ์šฉ์ž ๊ทœ๋ชจ API ๋ณ€๊ฒฝ ๋‚œ์ด๋„
๊ฐœ์ธ / ์†Œ๊ทœ๋ชจ ๋‚ฎ์Œ
์‚ฌ๋‚ด ๋‹ค์ˆ˜ ํŒ€ ๋†’์Œ (๋Œ€๋Ÿ‰ ์ˆ˜์ •, ๋ฆฌ๋นŒ๋“œ ํ•„์š”)
๊ณต๊ฐœ API ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ

API๋Š” ์„ฑ๊ณตํ• ์ˆ˜๋ก ๊ณ ์น˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค


API / ABI ํ˜ธํ™˜์„ฑ

์šฉ์–ด ์ •๋ฆฌ (Terminology)

  • Library API + Compiler ABI = Library ABI

ABI ํ˜ธํ™˜์„ฑ

  • ABI ํ˜ธํ™˜์„ฑ ๊นจ์ง์€

    • ์ตœ์•…์˜ ๊ฒฝ์šฐ: ๋ฏธ๋ฌ˜ํ•œ ์˜ค๋™์ž‘

    • ์ฐจ์„ ์˜ ๊ฒฝ์šฐ: ์ฆ‰์‹œ ํฌ๋ž˜์‹œ

  • ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ ํŠนํžˆ ์ค‘์š” (์˜ˆ: libstdc++)

  • ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ํ•ญ์ƒ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•œ๋‹ค๋ฉด ๋ฌด์‹œํ•  ์ˆ˜๋„ ์žˆ์Œ

API ํ˜ธํ™˜์„ฑ

  • API ๋น„ํ˜ธํ™˜์€ ๋ณดํ†ต ์ปดํŒŒ์ผ ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š์Œ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ (๋ฐ”์ด๋„ˆ๋ฆฌ/์†Œ์Šค ๋ชจ๋‘)

  • ์ „์ฒด๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ค‘์š”


ABI ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ

  • ์ƒˆ๋กœ์šด free function ์ถ”๊ฐ€

  • ํด๋ž˜์Šค์— friend ์„ ์–ธ ์ถ”๊ฐ€/์ œ๊ฑฐ

  • enum ๋์— ๊ฐ’ ์ถ”๊ฐ€ (๋‹จ, enum ํƒ€์ž… ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)

  • static ๋ฉค๋ฒ„ ๋ณ€์ˆ˜/ํ•จ์ˆ˜ ์ถ”๊ฐ€

  • non-virtual ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ (์˜ค๋ฒ„๋กœ๋“œ ์ œ์™ธ)

  • ์ƒ์„ฑ์ž ์ถ”๊ฐ€

  • ๊ธฐ๋ณธ ์ธ์ž ๊ฐ’ ๋ณ€๊ฒฝ

  • private non-virtual ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

  • typedef ๋ฐ ์ƒˆ ํƒ€์ž… ์ถ”๊ฐ€

  • inline ํ•จ์ˆ˜ โ†’ non-inline ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ

    • ๊ธฐ์กด์— ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ์ด์ „ ๊ตฌํ˜„์„ ๊ณ„์† ์‚ฌ์šฉ

ABI ํ˜ธํ™˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ

  • ๋ฉ”์„œ๋“œ ๋ณ€๊ฒฝ
    (const/constexpr, ๋ฐ˜ํ™˜ ํƒ€์ž…, ์ธ์ž ์œ„์น˜, cv-qualifier, ํ…œํ”Œ๋ฆฟ ํŒŒ๋ผ๋ฏธํ„ฐ, final/override, noexcept, inline/ํ…œํ”Œ๋ฆฟ ๊ตฌํ˜„ ๋‚ด์šฉ ๋“ฑ)

  • ํด๋ž˜์Šค ์ƒ์† ๊ตฌ์กฐ ๋ณ€๊ฒฝ

  • ํด๋ž˜์Šค ๋ฉค๋ฒ„ ์ถ”๊ฐ€/์ œ๊ฑฐ/์ˆœ์„œ ๋ณ€๊ฒฝ/ํƒ€์ž… ๋ณ€๊ฒฝ

  • ์˜ค๋ฒ„๋กœ๋“œ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐ

  • ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์ธ๋ผ์ด๋‹ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

  • ์ ‘๊ทผ ์ œ์–ด์ž ๋ณ€๊ฒฝ

  • virtual ํ•จ์ˆ˜ ์ถ”๊ฐ€/์ œ๊ฑฐ/์ˆœ์„œ ๋ณ€๊ฒฝ
    (non-virtual โ†” virtual ๋ณ€๊ฒฝ ํฌํ•จ)

  • ๋˜์ง€๋Š” ์˜ˆ์™ธ ๋ฐ ์˜ˆ์™ธ ๊ณ„์ธต ๋ณ€๊ฒฝ

  • ์ „์—ญ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž… ๋˜๋Š” cv-qualifier ๋ณ€๊ฒฝ


API ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ

  • ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€

  • ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

  • ํด๋ž˜์Šค์— ๋ฉค๋ฒ„ ์ถ”๊ฐ€

  • ํด๋ž˜์Šค ์ถ”๊ฐ€

  • ๋ฉค๋ฒ„ ๋˜๋Š” ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ


API ํ˜ธํ™˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ

  • ์ธ์ž, public/protected ๋ฉ”์„œ๋“œ, ๋ฉค๋ฒ„, ํด๋ž˜์Šค ์ œ๊ฑฐ

  • ์ธ์ž ๋˜๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ํƒ€์ž… ๋ณ€๊ฒฝ

  • public/protected ๋ฉค๋ฒ„๋‚˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ

  • ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ํ—ค๋”๋กœ ์ด๋™


API ์„ค๊ณ„ ์›์น™ (Guiding Principles)

1. ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค

  • ์˜จ๋ณด๋”ฉ ์‹œ๊ฐ„์ด ์งง์•„์ง„๋‹ค

  • ๋ฒ„๊ทธ์™€ ์˜ค์šฉ์ด ์ค„์–ด๋“ ๋‹ค

  • ์‚ฌ์šฉ๋ฅ ์ด ์ฆ๊ฐ€ํ•œ๋‹ค

  • ์ตœ์†Œ ๋†€๋žŒ์˜ ์›์น™(Principle of Least Surprise)

๋ฐฉ๋ฒ•:

  • ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํŒŒ๋ผ๋ฏธํ„ฐ, ํƒ€์ž… ์ด๋ฆ„์„ ์ž˜ ์ง“๋Š”๋‹ค

    • ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ 

    • ๊ฐ„๊ฒฐํ•˜๋ฉฐ

    • ๋„๋ฉ”์ธ ์˜๋ฏธ๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ 

    • ์ผ๋ฐ˜์ ์œผ๋กœ ํ†ต์šฉ๋˜๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉ

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€/์™ธ๋ถ€์—์„œ ์ผ๊ด€์„ฑ ์œ ์ง€

  • ์ ์ ˆํ•œ ์ถ”์ƒํ™” ์ˆ˜์ค€ ์œ ์ง€

  • ์˜ˆ: ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด ๋Œ€์‹  iterator๋ฅผ ์ „๋‹ฌ


2. ์˜ค์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ์„ค๊ณ„ํ•˜๋ผ

  • ๊ณ„์•ฝ์ด ๋ช…ํ™•ํ•˜๊ณ  ๋ฒ”์œ„๊ฐ€ ์ข์•„์•ผ ํ•œ๋‹ค

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์ง„ ์ฝ”๋”ฉ ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฅธ๋‹ค

  • ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๋Œ€๋กœ ์ •ํ™•ํžˆ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค


3. ๋ฌธ์„œํ™”๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค

๋ฌธ์„œ๊ฐ€ ์—†์œผ๋ฉด, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค

  • ๊ณต๊ฐœ๋œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฌธ์„œํ™”ํ•œ๋‹ค

  • ๊ณ„์•ฝ ์ •์˜๋Š” ๋ช…ํ™•ํ•˜๊ณ , ๊ฐ„๊ฒฐํ•˜๋ฉฐ, ๋ชจํ˜ธํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค

  • ํŠœํ† ๋ฆฌ์–ผ ์ œ๊ณต (๋ฌธ์„œ๋„ ์ฝ”๋“œ๋‹ค)

  • ๋ฌธ์„œ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค


4. ์ตœ์†Œํ•œ์œผ๋กœ ์™„๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค (Minimally Complete)

  • ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ํฌํ•จํ•œ๋‹ค

  • API ์กฐํ•ฉ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ์ œ์™ธํ•œ๋‹ค

  • ์ถ”์ƒํ™”์™€ ํ‘œํ˜„ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค

    • ์ถ”์ƒํ™”: ๊ตฌํ˜„์ด ๋‹ฌ๋ผ๋„ ๋™์ž‘์€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์•„์•ผ ํ•จ

    • ํ‘œํ˜„ ๋ถˆ๋ณ€์„ฑ: ๊ฐ์ฒด๊ฐ€ ํ•ญ์ƒ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด

์˜ˆ์‹œ:

  • std::mutex + std::lock_guard

    • mutex๋Š” primitive ์ œ๊ณต

    • lock_guard๋Š” ์˜ˆ์™ธ ์•ˆ์ „ํ•œ RAII ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ œ๊ณต


5. ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๋ผ (Loosely Coupled)

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํ˜ธ ์˜์กด์„ ์ตœ์†Œํ™”ํ•œ๋‹ค

  • ์ปดํฌ๋„ŒํŠธ๋Š” ์‘์ง‘๋ ฅ ์žˆ๊ฒŒ ๊ตฌ์„ฑํ•œ๋‹ค

๊ถŒ์žฅ ์‚ฌํ•ญ:

  • ์ˆœํ™˜ ์˜์กด์„ฑ ํ”ผํ•˜๊ธฐ

  • ํ•„์š”ํ•œ ๊ฒƒ๋งŒ include/import

  • callback, observer ํŒจํ„ด ํ™œ์šฉ

  • Mediator ํŒจํ„ด ํ™œ์šฉ (์ž์› ์ ‘๊ทผ ๋‹จ์ผ ์ฐฝ๊ตฌ)


6. ๊ตฌํ˜„ ๋””ํ…Œ์ผ์„ ๋…ธ์ถœํ•˜์ง€ ๋งˆ๋ผ

Hyrumโ€™s Law:

โ€œ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๊ด€์ธก ๊ฐ€๋Šฅํ•œ ์†์„ฑ์€
์–ธ์  ๊ฐ€ ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ์˜์กด๋œ๋‹คโ€

ํšจ๊ณผ:

  • ์‚ฌ์šฉ์ž๋Š” ๋„๋ฉ”์ธ ๊ด€์ ์œผ๋กœ ์„ค๊ณ„ ๊ฐ€๋Šฅ

  • API ์ œ๊ณต์ž๋Š” ๋ณ€๊ฒฝ ์ž์œ ๋„๊ฐ€ ์ปค์ง„๋‹ค

  • ์—…๊ทธ๋ ˆ์ด๋“œ์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค

๊ฐ€์ด๋“œ๋ผ์ธ:

  • ๋„๋ฉ”์ธ ํƒ€์ž…์„ ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค์— ์‚ฌ์šฉ

  • ๋‚ด๋ถ€ ํƒ€์ž… ๋…ธ์ถœ ๊ธˆ์ง€

  • ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ€์ž…/ํ•จ์ˆ˜ ๋…ธ์ถœ ๊ธˆ์ง€


7. ์žฅ๊ธฐ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜๋ผ

  • ์š”๊ตฌ์‚ฌํ•ญ์€ ๋ณ€ํ•œ๋‹ค

  • ํ”Œ๋žซํผ ์ œ์•ฝ๋„ ๋ณ€ํ•œ๋‹ค

  • ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ํ•„์š”๋Š” ์—†๋‹ค

  • ๊ธฐ๋Šฅ์€ ์ ์ง„์ ์œผ๋กœ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค

์˜ˆ์‹œ:

  • in/out ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ struct/class๋กœ ์ •์˜
    โ†’ ์ดํ›„ ํ•„๋“œ ํ™•์žฅ ๊ฐ€๋Šฅ

์ตœ์†Œ ๋†€๋žŒ์˜ ์›์น™:

  • ์‚ฌ์šฉ์ž์˜ ์˜ˆ์ธก์ด ๋งž์•„์•ผ ํ•œ๋‹ค

  • ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์ถ”์ธก์ด ํ‹€๋ฆฌ๋ฉด ์‹คํŒจํ•œ API๋‹ค


8. ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ”ผํ•˜๋ผ

  • ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ ์–‘์ด
    API ์ ํ•ฉ์„ฑ์„ ํŒ๋‹จํ•˜๋Š” ์ข‹์€ ์ง€ํ‘œ๋‹ค

  • ์ ์ ˆํ•œ ์ถ”์ƒํ™” ์ˆ˜์ค€ ์œ ์ง€

    • ์›น ์„œ๋ฒ„ API๋Š” socket์ด ์•„๋‹ˆ๋ผ HTTP ์š”์ฒญ/ํ—ค๋”๋ฅผ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค
  • ๋ฐ˜๋ณต๋˜๋Š” ๊ณตํ†ต ์ž‘์—…์„ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ œ๊ณต

  • ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์‰ฌ์›Œ์ง„๋‹ค


9. ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๋ผ

  • ํŠน์ • OS์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์„ค๊ณ„ ๊ธˆ์ง€

  • ํŠน์ • OS์—์„œ๋งŒ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์„ค๊ณ„๋„ ๊ธˆ์ง€

    • Windows vs POSIX

    • ์—”๋””์•ˆ ๋ฌธ์ œ

    • ์ปดํŒŒ์ผ๋Ÿฌ ์ข…์† ์ด์Šˆ

  • ์˜ค๋ฒ„๋กœ๋“œ๋˜๋Š” ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ํƒ€์ž… ์‚ฌ์šฉ


10. ํ…Œ์ŠคํŠธ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ณ ๋ คํ•ด ์„ค๊ณ„ํ•˜๋ผ

API ์„ค๊ณ„์˜ ํ™ฉ๊ธˆ๋ฅ :

๋„ค API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด๋ด๋ผ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ/ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค

  • mock ๋ถˆ๊ฐ€๋Šฅํ•œ concrete class API๋Š” ํ”ผํ•œ๋‹ค

  • ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ๊ถŒ์žฅ

  • ๋ณต์žกํ•œ API๋Š” mock ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”

    • ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP)
  • ์˜์กด์„ฑ์„ ๋Š๊ณ  ๋‹จ๋… ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค


11. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋ผ

  • ๋‚ด๋ถ€ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค

  • ์‹œ์Šคํ…œ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค

๊ถŒ์žฅ ๊ธฐ๋ฒ•:

  • PIMPL (Pointer to Implementation) ํŒจํ„ด

์š”์•ฝ (Summary)

  • ์ข‹์€ API๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค

  • ์‹ค์ œ ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค

  • API ์„ค๊ณ„ ์›์น™์„ ์ ์šฉํ•˜๋ฉด ํ’ˆ์งˆ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค


ํ•ต์‹ฌ ์ •๋ฆฌ (Takeaways)

  • API๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์•ฝ์†์ด๋‹ค

  • ์‚ฌ์šฉ์ž ๊ด€์  ์—†์ด ์ข‹์€ API๋Š” ๋‚˜์˜ฌ ์ˆ˜ ์—†๋‹ค

  • ๊ตฌํ˜„ ๋””ํ…Œ์ผ์€ ์ ˆ๋Œ€ API๋กœ ์ƒˆ์ง€ ์•Š๊ฒŒ ํ•˜๋ผ

  • API/ABI ํ˜ธํ™˜์„ฑ์€ ์„ค๊ณ„ ์ดˆ๊ธฐ์— ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค

  • โ€œ๋‚˜์ค‘์— ๊ณ ์น˜์žโ€๋Š” API ์„ค๊ณ„์—์„œ ๊ฑฐ์˜ ํ•ญ์ƒ ํ‹€๋ฆฐ ์„ ํƒ์ด๋‹ค

Reference

C++Now 2018: Titus Winters โ€œModern C++ API Design: From Rvalue-References to Type Designโ€

API Design Principles - John Pavan - CppNorth 2023

Testability and C++ API Design - John Pavan, Lukas Zhao & Aram Chung - C++Now 2024