How does Google design APIs?

โ€ป ์›๋ฌธ : How to Design a Good API and Why it Matters(Google Tech Talks, 2007.1.24) โ€ป ์ €์ž : Joshua Bloch, Principal Software Engineer, Google

01. API ์„ค๊ณ„๊ฐ€ ์™œ ์ค‘์š”ํ•œ๊ฐ€?

์ฒซ์งธ, API๋Š” ํšŒ์‚ฌ์˜ ์ค‘์š”ํ•œ ์ž์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ์ด์œ  ๋•Œ๋ฌธ์ด๋‹ค.

  • ๊ณ ๊ฐ(API ์‚ฌ์šฉ์ž)๋“ค์€ ๋ฌด์„ญ๊ฒŒ ํˆฌ์žํ•œ๋‹ค : ๊ตฌ๋งคํ•˜๊ณ , ์‚ฌ์šฉํ•˜๊ณ , ๋ฐฐ์šด๋‹ค.

  • ์šด์˜์ค‘์ธ API๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋น„์šฉ์€ ์—„๋‘๋„ ๋‚ผ ์ˆ˜ ์—†๋‹ค.

  • ์„ฑ๊ณต์ ์ธ Public API๋Š” ๊ณ ๊ฐ์„ ๋ถˆ๋Ÿฌ๋“ค์ธ๋‹ค.

Public API๋Š” ํ•œ๋ฒˆ ์˜คํ”ˆํ•˜๋ฉด ํ•จ๋ถ€๋กœ Shutdown ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ ์ œ๋Œ€๋กœ ๋งŒ๋“ค ๊ธฐํšŒ๋Š” ์˜ค์ง ๋”ฑ ํ•œ ๋ฒˆ ๋ฟ์ด๋‹ค.

์ฒ˜์Œ์— ๋งŒ๋“ค ๋•Œ ์ œ๋Œ€๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

02. ๋‚˜์—๊ฒŒ ์™œ API๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€?

์ฒซ์งธ, ๋‹น์‹ ์ด ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ๋‹น์‹ ์€ ์ด๋ฏธ API ์„ค๊ณ„์ž์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์ข‹์€ ์ฝ”๋“œ๋Š” ๋ชจ๋“ˆํ™”๋˜์–ด ์žˆ๊ณ , ์ข‹์€ ๋ชจ๋“ˆ์€ API๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ๊ทธ๋ž˜์„œ ๋‹น์‹ ์ด ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ์ข‹์€ API๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋Š”์ง€ ์•Œ์•„์•ผํ•œ๋‹ค.

๋‘˜์งธ, ์œ ์šฉํ•œ ๋ชจ๋“ˆ๋“ค์€ ๋ฐ˜๋“œ์‹œ ์žฌ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๋ชจ๋“ˆ์ด ์ผ๋‹จ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, ์ž„์˜๋กœ API๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

  • ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ๋“ค์€ ํšŒ์‚ฌ์˜ ์ž์‚ฐ์ด๋‹ค.

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

๋‹ค์Œ๊ณผ ๊ฐ™์€ 7๊ฐ€์ง€ ํŠน์ง•์ด ์žˆ๋‹ค.

  1. ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค.

  2. ๋ฌธ์„œ๊ฐ€ ์—†์–ด๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค.

  3. ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

  4. ์ฝ๊ธฐ ์‰ฝ๊ณ , API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค.

  5. ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•˜๋‹ค.

  6. ํ™•์žฅํ•˜๊ธฐ ์‰ฝ๋‹ค.

  7. ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜์ค€์— ๋งž์„ ๊ฒƒ.

04. ์ข‹์€ API์˜ ์„ค๊ณ„๋ฐฉ๋ฒ•

4.1. API ์„ค๊ณ„ ๊ณผ์ •

  1. ์ ๋‹นํ•œ ์ˆ˜์ค€, ํšŒ์˜์ ์ธ ํƒœ๋„๋กœ ์š”๊ตฌ์‚ฌํ•ญ ์ˆ˜์ง‘ํ•˜๊ธฐ.

์ข…์ข… ์†”๋ฃจ์…˜๋“ค์„ ์ œ์•ˆ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง„์งœ ์ค‘์š”ํ•œ ๊ฑด ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋ผ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด ๊ธฐ๋Šฅ ๋‚˜์—ด์ด ์•„๋‹ˆ๋ผ, ์œ ์ฆˆ ์ผ€์ด์Šค ํ˜•ํƒœ๋กœ ์ˆ˜์ง‘ํ•ด์•ผํ•œ๋‹ค. ์œ ์ฆˆ ์ผ€์ด์Šค๊ฐ€ ์ผ๋ฐ˜์ ์ผ ์ˆ˜๋ก ์„ค๊ณ„๊ฐ€ ๋” ์‰ฌ์›Œ์ง€๊ฑฐ๋‚˜, ๋ณด์ƒ์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.

  1. ์งง์€ ์ŠคํŽ™์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

ํ•œ ํŽ˜์ด์ง€๊ฐ€ ์ด์ƒ์ ์ด๋‹ค. Agility๊ฐ€ ์™„๋ฒฝํ•จ์„ ์ด๊ธด๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํ•œ ํŽ˜์ด์ง€ ๋‚ด์— ๋ชจ๋“  ๊ฑธ ๋‹ด์•„๋ด๋ผ.

๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฐ˜์‘์„ ์‚ดํŽด๋ผ. ๊ทธ๋“ค์˜ ์ด์•ผ๊ธฐ๋ฅผ ๊ท€ ๊ธฐ์šธ์—ฌ ๋“ฃ๊ณ , ์‹ฌ๊ฐํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ๋ผ.

์ŠคํŽ™์ด ์ž‘์„์ˆ˜๋ก, ๊ณ ์น˜๊ธฐ ์‰ฝ๋‹ค. ์ž์‹ ๊ฐ์„ ์–ป์„ ๋•Œ๊นŒ์ง€ ์‚ด์„ ๋ถ™์—ฌ๋ผ. ์ด ๊ณผ์ •์€ ํ•„์—ฐ์ ์œผ๋กœ ์ฝ”๋”ฉ์„ ๋™๋ฐ˜ํ•œ๋‹ค.

  1. ๋ฏธ๋ฆฌ API์— ๊ธ€์„ ์ ๊ธฐ. ์•„์ฃผ ์ž์ฃผ ์ ์–ด๋‘๊ธฐ.

๋นˆ function ๋‚ด์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ฃผ์„์œผ๋กœ ๋ฏธ๋ฆฌ ์ ์–ด๋ผ.

๊ฐ€๋Šฅํ•œ ์ž์ฃผ ์ƒ๊ฐ๋‚  ๋•Œ๋งˆ๋‹ค ์ ์–ด ๋„ฃ์–ด๋ผ.

API ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋งŽ์ด ์ ˆ์•ฝํ•ด์ค€๋‹ค.

๊ฐ€๋Šฅํ•œ ์ŠคํŽ™์„ ์žก๊ธฐ ์ด์ „๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ผ. ์ŠคํŽ™์„ ์žก๋Š” ์‹œ๊ฐ„๋„ ์ ˆ์•ฝํ•ด์ค€๋‹ค.

์‚ด์ด ๋ถ™์„ ๋•Œ๊นŒ์ง€ API์— ๊ธ€์„ ์ ์–ด๋ผ. ๋”์ฐํ•œ ์‹คํŒจ๋ฅผ ์˜ˆ๋ฐฉํ•ด์ค€๋‹ค.

์ฝ”๋“œ๋Š” ์˜ˆ์ œ์™€ Unit Test๋ฅผ ๋จน๊ณ  ์‚ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  1. ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค์— ์ ๋Š” ๊ฑด ๋” ์ค‘์š”

์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค๋ž€, ๋‚จ์ด ์“ฐ๋ผ๊ณ  ์—ด์–ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋œปํ•œ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ Implementation์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

Java Cryptographt Extension ๊ฐ™์€ ๊ฒƒ์ด๋‹ค.

๋ฐฐํฌํ•˜๊ธฐ ์ „์— Multiple plugin๋“ค์„ ๋งŒ๋“ค์–ด๋ผ.

  1. ๋งŒ์ผ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๋ฉด, ์•„๋งˆ๋„ API๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์€ ์ง€์›ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

  2. ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด, ์–ด๋ ต๊ฒŒ๋ผ๋„ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ง€์›ํ•˜๊ธฐ๋Š” ํ•  ๊ฒƒ์ด๋‹ค.

  3. ์„ธ ๊ฐœ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์•„์ฃผ ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋‹ค.

  4. ํ˜„์‹ค์  ๊ธฐ๋Œ€์ˆ˜์ค€์„ ๋ฐ›์•„๋“ค์ด๊ธฐ

API ์„ค๊ณ„๋ฅผ ๋ณด๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ง€๋‚˜์น˜๊ฒŒ ์ œ์•ฝ๋˜์–ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ƒฅ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ๋˜‘๊ฐ™์ด ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋ผ.

์‹ค์ˆ˜๋ฅผ ๋„ˆ๋ฌด ์‹ ๊ฒฝ์“ฐ์ง€๋ง๊ณ , ๊ทธ๊ฑธ ๊ธฐํšŒ๋กœ API๋ฅผ ์ง„ํ™”์‹œ์ผœ๋ผ.


4.2. ์ผ๋ฐ˜ ์›์น™

API๋Š” ํ•˜๋‚˜์˜ ์ผ๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๊ทธ๊ฑธ ์•„์ฃผ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค.

๋งŒ์ผ ์ด๋ฆ„์ง“๊ธฐ ํž˜๋“ค๋‹ค๋ฉด, ๊ธฐ๋Šฅ์„ ๋ณต์žกํ•˜๊ฒŒ ์ •์˜ํ•œ ๊ฒƒ์ด๋‹ค. ์ข‹์€ ์ด๋ฆ„์„ ์ง€์–ด๋ณด๋ผ.

๊ฐœ๋ฐœ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋  ์ˆ˜ ์žˆ๋„๋ก, ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๋“ค์„ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ํ•ฉ์ณ๋ณด๋ผ.

API๋Š” ๊ฐ€๋Šฅํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ๋„ˆ๋ฌด ์ž‘์•„์„œ๋Š” ์•ˆ๋œ๋‹ค. API๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•  ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ๋‘์–ด๋ผ.

๊ธฐ๋Šฅ, class, method, param๊นŒ์ง€ ๋ญ”๊ฐ€๋ฅผ ๋”ํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ, ์ œ๊ฑฐํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

์ผ๋‹จ API๊ฐ€ ๋ฐฐํฌ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํšŒ์ˆ˜ํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฐœ๋…์ ์ธ ๋ฌด๊ฒŒ๊ฐ์ด ๊ธฐ๋Šฅ์˜ ๊ทœ๋ชจ๋ณด๋‹ค ๋” ์ค‘์š”ํ•˜๋‹ค. API ์˜ ํž˜๊ณผ ๋ฌด๊ฒŒ ๊ฐ„์˜ ๊ท ํ˜•๋น„๋ฅผ ์ฐพ์•„๋ผ.

Implementation ์ด API์— ์˜ํ–ฅ์„ ์ฃผ์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

๊ตฌํ˜„์ด ๋„ˆ๋ฌด ์„ธ์„ธํ•ด์ง€๋ฉด, API ์‚ฌ์šฉ์ž๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•œ๋‹ค.

Implementation ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ทธ๋“ค์˜ ์ž์œ ๋ฅผ ๋ฐฉํ•ดํ•œ๋‹ค.

์„ธ์„ธํ•œ ๊ตฌํ˜„์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ์ •ํ™•ํžˆ ์•Œ์•„๋ผ.

Method behavior ์ŠคํŽ™์„ ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ์žก์ง€ ๋งˆ๋ผ.

์˜ˆ๋ฅผ ๋“ค๋ฉด Hash function ๋“ค์€ ์ŠคํŽ™ํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ชจ๋“  ํŠœ๋‹ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์ด ๊ผญ ํ•„์š”ํ•œ์ง€ ์˜์‹ฌํ•ด ๋ณธ๋‹ค.

์ฆ‰, ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ์ข‹์€ API ๊ฐ€ ์•„๋‹ˆ๋‹ค.

API ์„ค๊ณ„์— ์‚ฌ์šฉ์ž๋“ค์˜ ์„ธ์„ธํ•œ Implementation ์„ ๋ชจ๋‘ ๋‹ด์ง€ ๋งˆ๋ผ. ๋””์Šคํฌ ์ƒ์ด๋‚˜, ๋„คํŠธ์›Œํฌ ์ƒ์ด๋‚˜, ์˜ˆ์™ธ ์ผ€์ด์Šค๋กœ๋ผ๋„ !!!

๋ชจ๋“  ๊ฒƒ์˜ ์ ‘๊ทผ์„ ์ตœ์†Œํ™”ํ•˜๋ผ.

๊ฐ€๋Šฅํ•œ Private ํ•˜๊ฒŒ Class ์™€ Member๋ฅผ ๋งŒ๋“ค์–ด๋ผ.

Public class ๊ฐ€ ๊ฐ€๋Šฅํ•œ Public field๋ฅผ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋œ๋‹ค.

์ •๋ณด์€ํ๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๋ผ.

๋ชจ๋“ˆ์ด ๋…๋ฆฝ์ ์œผ๋กœ Debug ๋˜๊ณ , ์ดํ•ด๋˜์–ด์ง€๊ณ , ๊ตฌ์ถ•๋˜์–ด์ง€๊ณ , ํ…Œ์ŠคํŠธ ๋˜์–ด์ง€๋„๋ก ํ•˜๋ผ.

์ด๋ฆ„์ด ์ค‘์š”ํ•˜๋‹ค.

API ๋Š” ์ž‘์€ ์–ธ์–ด๋‹ค. ์ด๋ฆ„์€ ๊ตณ์ด ์„ค๋ช…ํ•˜์ง€ ์•Š์•„๋„ ์ดํ•ด๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ธฐํ˜ธ๋‚˜ ์ถ•์•ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.

API ์ „๋ฐ˜์— ๊ฑธ์ณ, ๋˜‘๊ฐ™์€ ๋‹จ์–ด๋ผ๋ฉด ๊ธฐ๋Šฅ๋„ ๊ฐ™์€ ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.

๊ทœ์น™์ ์ด์–ด์•ผ ํ•œ๋‹ค. ๋Œ€์นญ๊ณผ ๊ท ํ˜•์„ ๊ฐˆ๊ตฌํ•˜๋ผ. ์ฝ”๋“œ๋Š” ์‚ฐ๋ฌธ์ฒ˜๋Ÿผ ์ฝํž ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ข…๊ต์ฒ˜๋Ÿผ ๋ฌธ์„œํ™”ํ•˜๋ผ.

๋ชจ๋“  class, interface, method, constructor, parameter, and exception ์„ ๋ฌธ์„œํ™”ํ•˜๋ผ.

  • Class : instance ํ™” ๋˜๋Š” ๊ฒƒ๋“ค

  • Method : method ์™€ ๊ทธ client ๋“ค๊ฐ„์˜ ๊ณ„์•ฝ๋“ค์ด๋‹ค.

  • Parameter : units, form, ownership ๋“ฑ์„ ์ง€์นญํ•œ๋‹ค.

State-space ๋ฅผ ์ฃผ์˜๊นŠ๊ฒŒ ๋ฌธ์„œํ™”ํ•˜๋ผ.

API์˜ ์„ฑ๋Šฅ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ๋ คํ•˜๋ผ.

๋‚˜์œ ์˜์‚ฌ๊ฒฐ์ •์€ ์„ฑ๋Šฅ ํ•œ๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค.

  • Type ์„ ์ƒํ˜ธ ๊ตํ™˜๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.

  • Static factory ๋Œ€์‹  Constructor ๋ฅผ ์ œ๊ณตํ•˜๋ผ.

  • Interface ๋Œ€์‹ ์— Implementation type ์„ ์‚ฌ์šฉํ•˜๋ผ.

์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด API๋ฅผ ๋’คํ‹€์ง€ ๋งˆ๋ผ.

  • ๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๊ณ ์ณ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ์˜์›ํ•œ ๊ณจ์น˜๊ฑฐ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ์ผ์ด๋‹ค.

  • ์ข‹์€ ์„ค๊ณ„๋Š” ์ข‹์€ ์„ฑ๋Šฅ๊ณผ ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ์น˜ํ•œ๋‹ค.

์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•œ API ์„ค๊ณ„๋Š” ์‹ค์งˆ์ ์ธ ํšจ๊ณผ๋กœ ๋‚˜ํƒ€๋‚  ๋ฟ ์•„๋‹ˆ๋ผ ์˜์›ํ•˜๋‹ค.

Component.getSize()๋Š” Dimension์„ return ํ•œ๋‹ค. Dimenstion ์€ mutual ํ•˜๋‹ค.

๋ชจ๋“  getSize call ์€ Dimension์„ ํ• ๋‹นํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

์ˆ˜๋งŽ์€ ๋ถˆํ•„์š”ํ•œ object allocation ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๋Œ€์ฒด์•ˆ์ด 1.2 ๋ฒ„์ „์— ์ถ”๊ฐ€๋œ๋‹ค : old client code ๋Š” ์—ฌ์ „ํžˆ ๋А๋ฆฌ๋‹ค.

API๋Š” ํ”Œ๋žซํผ๊ณผ ํ‰ํ™”์ ์œผ๋กœ ๊ณต์กดํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๊ด€์Šต์ ์ธ ๊ฒƒ์„ ๋”ฐ๋ผ๋ผ.

  • ํ‘œ์ค€ naming rule ์„ ๋”ฐ๋ผ๋ผ.

  • ๋…์ž์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ Return Type์„ ์“ฐ์ง€๋งˆ๋ผ.

  • ์ฝ”์–ด API๋‚˜ ์–ธ์–ด์— ์žˆ๋Š” ํŒจํ„ด์„ ํ‰๋‚ด๋‚ด์–ด ์จ๋ผ.

API ์นœํ™”์ ์ธ ํŠน์ง•์„ ์ด์šฉํ•˜๋ผ.

  • Generics, varargs, enums, default arguments

API ์˜ ์œ„ํ—˜๊ณผ ๋‹จ์ ๋“ค์„ ์ž˜ ์•Œ๊ณ  ํšŒํ”ผํ•˜๋ผ.

  • finalizers, Public static final arrays


4.3. Class ์„ค๊ณ„

๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•˜๋ผ.

๋งŒ์ผ ๋‹ค๋ฅธ ์ผ์„ ํ•ด์•ผ ํ•  ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด, class ๋Š” ๋ถˆ๋ณ€์˜ ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.

  • ์žฅ์  : simple, thread-safe, reusable

  • ๋‹จ์  : ๊ฐ value ๋ณ„๋กœ ๋ถ„๋ฆฌ๋œ object

๋งŒ์ผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด, State-space๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ์ •์˜๋ฅผ ์ž˜ ์œ ์ง€ํ•˜๋ผ. ์–ธ์ œ, ์–ด๋–ค method๋ฅผ ๋ถ€๋ฅด๋Š”๊ฒŒ ํ•ฉ๋ฆฌ์ ์ธ์ง€๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋ผ.

  • Bad: Date, Calendar

  • Good: TimerTask

Subclass๋Š” Substitutability ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

โ€œโ€ฆ์€ โ€ฆ์ด๋‹คโ€ ๋ผ๋Š” ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•  ๋•Œ๋งŒ subclass ๋ฅผ ์จ๋ผ.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, Composition ์„ ์‚ฌ์šฉํ•˜๋ผ.

  • Bad: Properties extends Hashtable, Stack extends Vector

  • Good: Set extends Collection

์ƒ์†์„ ์œ„ํ•ด ์„ค๊ณ„ํ•˜๊ณ  ๋ฌธ์„œ๋ฅผ ๋‚จ๊ฒจ๋ผ.

์„ค๊ณ„๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ๋ฌธ์„œ๊ฐ€ ์—†๋‹ค๋ฉด, ์ƒ์†์„ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.

์ƒ์†์ด๋ž€ ์บก์Аํ™”์™€ ์ƒ์ถฉํ•œ๋‹ค.

  • subclass ๋Š” superclass ์˜ ์„ธ์„ธํ•œ ๊ตฌํ˜„์— ๋ฏผ๊ฐํ•˜๋‹ค. ๋งŒ์ผ subclass ๋ฅผ ํ—ˆ๋ฝํ•œ๋‹ค๋ฉด, self-use๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋ผ.

  • method๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ method ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋ผ. ๋ณด์ˆ˜์ ์ธ ์ •์ฑ…์œผ๋กœ๋Š” ๋ชจ๋“  ๊ตฌ์ฒด์ ์ธ class ๋Š” final ์ด์–ด์•ผ ํ•œ๋‹ค.

  • Bad: Many concrete classes in J2SE libraries

  • Good: AbstractSet, AbstractMap


4.4. Method ์„ค๊ณ„

๋ชจ๋“ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ Client๊ฐ€ ํ•˜๊ฒŒ ํ•˜์ง€ ๋งˆ๋ผ.

Boilerplate code ์— ๋Œ€ํ•œ ํ•„์š”๋ฅผ ์ค„์—ฌ๋ผ.

  • Boilerplate code ๋ž€ ์ผ๋ฐ˜์ ์œผ๋กœ cut-and-paste ๋กœ ํ–‰ํ•ด์ง€๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•œ๋‹ค.

  • ๋ชจ๋“ˆ์„ cut&pasteํ•ด์„œ Client ๋‚ด์— ๋„ฃ์–ด๋ฒ„๋ฆฌ๋ฉด, ์•„์ฃผ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์˜ค๋ฅ˜ ๋ฐœ์ƒ์ด ์žฆ๊ฒŒ ๋œ๋‹ค.

โ€œ์‚ฌ์šฉ์ž๋ฅผ ๋†€๋ผ๊ฒŒ ํ•˜์ง€ ์•Š๊ธฐโ€ ์›์น™์„ ์ค€์ˆ˜ํ•˜๋ผ

API ์‚ฌ์šฉ์ž๊ฐ€ Behavior ์— ์˜ํ•ด ๋†€๋ผ์„œ๋Š” ์•ˆ๋œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„์— ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ผ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ์กฐ๊ธˆ ์„ฑ๋Šฅ์„ ๊นŽ์—ฌ๋„ ๋ ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค.

๋นจ๋ฆฌ ์‹คํŒจํ•˜๋ผ.

์žฅ์• ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ๊ฐ€๋Šฅํ•œํ•œ ๋นจ๋ฆฌ ์—๋Ÿฌ๋ฅผ ์•Œ๋ ค๋ผ. ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์ œ์ผ ์ข‹๋‹ค.

static typing, generics

๋Ÿฐํƒ€์ž„์—, ์ฒซ ์ž˜๋ชป๋œ method invocation ์ด ์ œ์ผ ์ข‹๋‹ค.

method ๋Š” ๋ฐ˜๋“œ์‹œ failure-atomic ํ•ด์•ผ ํ•œ๋‹ค.

String ํฌ๋งท์œผ๋กœ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ์–ด๋ผ.

๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด client๋Š” string์„ parseํ•ด์•ผํ•œ๋‹ค.

  • Client๋Š” ๊ดด๋กญ๋‹ค.

  • ๋” ๋‚˜์œ ๊ฑด, string์ด ์‚ฌ์‹ค ์ƒ์˜ API๋กœ ๋ณ€์งˆ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

์ฃผ์˜๋ฅผ ๊ฐ€์ง€๊ณ  Overloadingํ•˜๋ผ.

๋ชจํ˜ธํ•œ ์˜ค๋ฒ„๋กœ๋“œ๋Š” ํ”ผํ•˜๋ผ.

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋™์‹œ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณด์ˆ˜์ ์ด ๋˜์–ด๋ผ : ๋™์ผํ•œ argument ์ˆซ์ž๊ฐ€ ์—†๋„๋ก ํ•˜๋ผ.

๋ชจํ˜ธํ•œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋™์ผํ•œ arguments์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ผํ•œ behavior ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜๋ผ.

์ ์ ˆํ•œ Parameter์™€ Return type ์„ ์‚ฌ์šฉํ•˜๋ผ.

Input ์„ ์œ„ํ•ด class ์ „๋ฐ˜์— interface type ์„ ์žฅ๋ คํ•˜๋ผ. ์œ ์—ฐ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋ผ.

๊ฐ€์žฅ ๊ตฌ์ฒด์ ์ด๋ฉด์„œ ๊ฐ€๋Šฅํ•œ input parameter type ๋“ค์„ ์‚ฌ์šฉํ•˜๋ผ.

๋Ÿฐํƒ€์ž„ ์‹œ๊ฐ„์œผ๋กœ๋ถ€ํ„ฐ ์ปดํŒŒ์ผ ์‹œ๊ฐ„๊นŒ์ง€ ์—๋Ÿฌ๋ฅผ ์˜ฎ๊ฒจ๋ผ.

๋” ์ข‹์€ type ์ด ์žˆ์œผ๋ฉด, string ์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ.

String ์€ ๋ฌด๊ฒ๊ณ , ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ธฐ ์‰ฝ๊ณ , ๋А๋ฆฌ๊ธฐ๊นŒ์ง€ ํ•˜๋‹ค.

ํ†ตํ™”๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ floating point ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ.

binary floating point ๋Š” ๋ถ€์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์•ผ๊ธฐ์‹œํ‚จ๋‹ค.

float(32 bits) ๋ณด๋‹ค double(64 bits)๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

์ •ํ™•์„ฑ ์†์‹ค์€ ํ˜„์‹ค์ด๊ณ , ์„ฑ๋Šฅ ์†์‹ค์€ ๋ฌด์‹œํ• ๋งŒ ํ•˜๋‹ค.

Method ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๊ด€์ ์ธ Parameter ordering์„ ์‚ฌ์šฉํ•˜๋ผ.

ํŠนํžˆ parameter type ๋“ค์ด ๋™์ผํ•  ๋•Œ ๋”์šฑ ์ค‘์š”ํ•˜๋‹ค.

๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋งŒ๋“ค์ง€ ๋งˆ๋ผ.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๋Š” 3 ๊ฐœ, ๋˜๋Š” ๋” ์ ์€ ์ˆ˜๊ฐ€ ์ด์ƒ์ ์ด๋‹ค. ๋” ๋งŽ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋“ค์€ ๋ฌธ์„œ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋ ค ํ•œ๋‹ค.

ํŠนํžˆ ๋˜‘๊ฐ™์ด ํƒ€์ดํ•‘๋œ ๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ๋Š” ์œ„ํ—˜ํ•˜๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ Parameter ์ˆœ์„œ๋ฅผ ์‹ค์ˆ˜๋กœ ๋ฐ”๊พธ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก  ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ์ปดํŒŒ์ผ๋˜๊ณ  ์ž˜ ์‹คํ–‰๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒŒ ๋” ํฐ ๋ฌธ์ œ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์งง๊ฒŒํ•  ์ˆ˜ ์žˆ๋Š” ๋‘๊ฐ€์ง€ ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค.

  • method ๋ฅผ ๋‘๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด๋ผ.

  • ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก Helper class ๋ฅผ ๋งŒ๋“ค์–ด๋ผ.

์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋Š” Return Value๋ฅผ ๋งŒ๋“ค์ง€ ๋งˆ๋ผ.

zero-length array๋ฅผ ๋ฆฌํ„ดํ•˜๊ฑฐ๋‚˜ ๋นˆ collection ์„ ๋ฆฌํ„ดํ•˜๋ผ. null ์„ ๋ฆฌํ„ดํ•˜์ง€ ๋งˆ๋ผ.


4.5. Exception ์„ค๊ณ„

์˜ˆ์™ธ ์ƒํ™ฉ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด Exception์„ ๋˜์ ธ๋ผ.

Client ๊ฐ€ Control flow ๋ฅผ ์œ„ํ•ด exception์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

์ •๋ฐ˜๋Œ€๋กœ, ์กฐ์šฉํ•˜๊ฒŒ fail์ด ๋‚˜์„œ๋Š” ์•ˆ๋œ๋‹ค.

Unchecked Exceptions์„ ์‚ฌ์šฉํ•˜๋ผ.

  • Checked : client ๊ฐ€ recovery action ์„ ํ•ด์•ผ ํ•œ๋‹ค

  • Unchecked : programming error

  • ๋ฌผ๋ก  Checked exceptions ์˜ ๊ณผํ•œ ์‚ฌ์šฉ์€ boilerplate ๋ฅผ ์•ผ๊ธฐ์‹œํ‚จ๋‹ค.

์˜ˆ์™ธ ์•ˆ์— ์—๋Ÿฌ์ •๋ณด(failure-capture information)๋ฅผ ํฌํ•จ์‹œ์ผœ๋ผ.

์ง„๋‹จ์„ ํ—ˆ์šฉํ•˜๊ณ  repair ํ•˜๊ฑฐ๋‚˜ recovery ํ•˜๋ผ.

unchecked exception์— ๋Œ€ํ•ด์„œ๋Š” ๋ฉ”์‹œ์ง€๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

checked exception์— ๋Œ€ํ•ด์„œ๋Š” accessor ๋ฅผ ์ œ๊ณตํ•˜๋ผ.


4.6. ๊ฒฐ๋ก 

1. API ๋””์ž์ธ์€ ์šฐ์•„ํ•˜๋ฉด์„œ๋„ ๋ˆ์„ ๋ฒŒ ์ˆ˜ ์žˆ๋Š” ํ–‰์œ„์ด๋‹ค.

๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ์‚ฌ์šฉ์ž๋“ค๊ณผ ํšŒ์‚ฌ๋“ค์„ ์ด๋กญ๊ฒŒ ํ•œ๋‹ค.

2. ์ด ์ด์•ผ๊ธฐ๋Š” ์–ด๋–ค ์˜๋ฏธ์—์„œ ํœด๋ฆฌ์Šคํ‹ฑํ•œ ๊ธฐ๋ฒ•๋“ค์„ ๋ฎ์–ด๋ฒ„๋ฆฐ๋‹ค.

๋…ธ์˜ˆ๊ฐ™์ด ํœด๋ฆฌ์Šคํ‹ฑํ•œ ๊ธฐ์ˆ ๋“ค์— ๋‹ฌ๋ผ๋ถ™์ง€ ๋งˆ๋ผ. ์ถฉ๋ถ„ํ•œ ์ด์œ ์—†์ด ๊ทธ๋“ค์„ ์นจ๋ฒ”ํ•˜์ง€๋„ ๋งˆ๋ผ.

3. API ๋””์ž์ธ์€ ํž˜๋“ค๋‹ค.

ํ˜ผ์žํ•˜๋Š” ์ž‘์—…์ด ์•„๋‹ˆ๋‹ค. ์™„๋ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์™„๋ฒฝํ•ด์ง€๋ ค๊ณ  ์‹œ๋„ํ•˜๋ผ.

4. ๋ป”๋ป”ํ•˜๊ฒŒ ์Šค์Šค๋กœ Promotionํ•˜๋ผ.

Last updated