Community

๐Ÿค” API Versioning ์€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ• ๊นŒ?

Restful API ๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•˜๋Š”๊ฒƒ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ API Versioning ์ด์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ง‰์ƒ ์ด๋ ‡๊ฒŒ API ์— Versioning ์„ ํ•ด๋„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ๋งŽ์„ํ…๋ฐ์š” API Versioning ์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ๋ช…์พŒํ•˜๊ฒŒ ์„ค๋ช…ํ•œ ๊ธ€์ด ์žˆ์–ด ๊ณต์œ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ธ€์˜ ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ“Œ API Versioning ๋ฐฉ๋ฒ• * URI Versioning: "/api/v1/hello" ์™€ ๊ฐ™์ด URI ์— version ์„ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹ * Media Type Versioning: "Accept: application/json; v=1" ๊ณผ ๊ฐ™์ด HTTP Accept Header ์— version ์„ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹ ๐Ÿ“Œ API ๊ณต๊ฐœ ๋Œ€์ƒ์— ๋”ฐ๋ฅธ Versioning ์—ฌ๋ถ€ * Public API: ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์ œ๊ณตํ•˜๋Š” API ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”. ์›น ๋ฌธ์„œ ๋“ฑ์„ ํ†ตํ•ด API ์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. * Private API: ์‚ฌ๋‚ด์—์„œ ์„œ๋น„์Šค๊ฐ„ ์—ฐ๋™ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” API ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  integration ๋ฐ ํ’ˆ์งˆ ํ…Œ์ŠคํŠธ ๋“ฑ์„ ํ†ตํ•ด ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด version ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง„ ์•Š๋‹ค. * Partner API: API ๋ฅผ ์ œ๊ณตํ•˜๋Š” Partner ์˜ ๋ฒ”์œ„๋‚˜ ๊ฐœ๋ฐœ ์ง€์†์„ฑ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ•„์š” ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“Œ Version ์—…๋ฐ์ดํŠธ๋Š” ์–ธ์ œ ํ•ด์•ผํ• ๊นŒ? * API ๋ฆฌ์†Œ์Šค ์—”๋“œํฌ์ธํŠธ์˜ ์ด๋ฆ„์ด๋‚˜ ๊ฒฝ๋กœ, HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๊ฒฝ์šฐ * ์—ด๊ฑฐํ˜•(enum type)๊ฐ’ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ˜น์€ ์‚ญ์ œ * ํ•„๋“œ์˜ ํƒ€์ž… ๋ณ€๊ฒฝ(์ด์ „ ํƒ€์ž…๊นŒ์ง€ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ํ•ด๋‹นํ•˜์ง€ ์•Š์Œ) * ์ˆ˜ํ–‰ํ–ˆ๋˜ ์ž‘์—…์ด๋‚˜ ์‘๋‹ต ํฌ๋งท์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ๐Ÿ“Œ API ๋ฒ„์ „์„ ์ƒˆ๋กœ ๋ฆด๋ฆฌ์ฆˆํ•  ๋•Œ ์ง„ํ–‰ ๊ณผ์ • * API ๊ฐœ๋ฐœํŒ€์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋งŒ๋“ค๊ณ , ์ƒˆ ๋ฒ„์ „์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. * ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ๋ฐ ํ”„๋กœ๋•์…˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๊ณ  ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. * ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฌธ์„œํ™”ํ•˜๊ณ , ๋ชจ๋“  ๊ณ ๊ฐ์—๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ์ง€์›ํŒ€์˜ ๋„์›€ ์š”์ฒญ์—๋„ ์‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. * ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์œ ์ง€ํ•˜๋ฉฐ, ๊ณ ๊ฐ์ด ๊ทธ์‚ฌ์ด ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. * ๊ธฐ์กด ๋ฒ„์ „์˜ ์œ ํšจ ๊ธฐ๊ฐ„๊นŒ์ง€ ์ „ํ™˜ํ•˜์ง€ ์•Š์€ ์ผ๋ถ€ ๊ณ ๊ฐ์€ ๊ฒฐ๊ตญ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ“Œ API Versioning์ด ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ๋Š”? * HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ * HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต์œผ๋กœ header, body์— ํ•„๋“œ๋ฅผ ์˜ต์…˜์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ * ์—ด๊ฑฐํ˜•(enum type)์— ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’ ์ถ”๊ฐ€ * HTTP ๋ฆฌ์†Œ์Šค URI๊ฐ€ ํ™•์žฅ๋˜๋Š” ๊ฒฝ์šฐ * ์—๋Ÿฌ ์‘๋‹ต์˜ ์ƒ์„ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ * ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ ์•„์ด๋”” ์ ์šฉ ๋ฒ”์œ„ ํ™•์žฅ * Rate-limit๊ณผ ๊ด€๋ จ๋œ ํ—ค๋” ๊ฐ’ ์กฐ์ • ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ๊ณต์œ ๋“œ๋ฆฐ ์›๋ฌธ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ๐Ÿ“š ์›๋ฌธ * https://yozm.wishket.com/magazine/detail/2554/

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค