[ ๐Ÿ‘‰ API ์„ค๊ณ„ ๋ฐ ํ†ต์‹  ์Šคํ„ฐ๋””]

yongcraneยท2025๋…„ 3์›” 25์ผ

๐Ÿ‘‰ API ์„ค๊ณ„ ๋ฐ ํ†ต์‹ 

์˜๋„ : API ์„ค๊ณ„์™€ ํ†ต์‹  ์นดํ…Œ๊ณ ๋ฆฌ๋Š” RESTful API, GraphQL ๋“ฑ์˜ํ†ต์‹  ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. API ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ์„œ๋น„์Šค์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ์ค‘์š”ํ•œ ์š”์†Œ๋ชจ์ด๋ฉฐ, OAuth 2.0๊ณผ ๊ฐ™์€ ์ธ์ฆ ๋ฐฉ์‹์€๋ณด์•ˆ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. API์˜ ์ƒํƒœ ์ฝ”๋“œ, ๋ฉฑ๋“ฑ์„ฑ(Idempotency)๋“ฑ์˜ ๊ฐœ๋…๋„ ์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋‹ค๋ค„์ง€๋Š” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๋‹ต๋ณ€์— ํฌํ•จํ•ด์•ผํ•  ํ‚ค์›Œ๋“œ

  • RESTful API : HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE)์˜ ํ™œ์šฉ
  • GraphQL : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” API ๋ฐฉ์‹
  • OAuth 2.0 : ์‚ฌ์šฉ์ž ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ
  • ๋ฉฑ๋“ฑ์„ฑ(Idmpotency) : ๋™์ผํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•œ์ง€ ์—ฌ๋ถ€
  • HTTP ์ƒํƒœ ์ฝ”๋“œ : 200(์„ฑ๊ณต), 404(ํŽ˜์ด์ง€ ์—†์Œ), 500(์„œ๋ฒ„ ์˜ค๋ฅ˜) ๋“ฑ์˜ ์˜๋ฏธ

โญ RESTful API๋Š” REST์˜ ์›์น™์„ ๋”ฐ๋ฅด๋Š” API๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ž์›์„ URL(์—”๋“œํฌ์ธํŠธ)๋กœ ํ‘œํ˜„ํ•˜๊ณ  HTTP ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์ž์›์„ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ์‹์ด๋‹ค.

โญ SOAP ์†Œํ”„(Simple Object Access Protocol)์€ XML ๊ธฐ๋ฐ˜์˜ ๋ฉ”์‹œ์ง€ ํ”„๋กœํ† ์ฝœ๋กœ, ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ‘œ์ค€ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜, ๋ฉ”์‹œ์ง€ ์‹ ๋ขฐ์„ฑ์„ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธฐ๋Š” ํ™˜๊ฒฝ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

โญ GraphQL์€ Facebook์—์„œ ๊ฐœ๋ฐœํ•œ API ์ฟผ๋ฆฌ ์–ธ์–ด๋กœ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๋ฐฉ์‹์ด๋‹ค. REST API์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ์—์„œ ์š”์ฒญ(Query)๋งˆ๋‹ค ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. [ํ•˜] RESTful API์˜ ์„ค๊ณ„ ์›์น™์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

RESTful API์˜ ์„ค๊ณ„ ์›์น™์€ ๋ฆฌ์†Œ์Šค ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์ฃผ์š” ์›์น™์€
ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
๋ฌด์ƒํƒœ์„ฑ(Stateless) : ์š”์ฒญ ๊ฐ„์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์Œ
์บ์‹œ ๊ฐ€๋Šฅ : ์‘๋‹ต์„ ์บ์‹ฑํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”
๊ณ„์ธตํ™”๋œ ์‹œ์Šคํ…œ : ์—ฌ๋Ÿฌ ๊ณ„์ธต์„ ํ†ตํ•ด ๊ตฌ์กฐํ™” ๊ฐ€๋Šฅ
์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค : HTTP ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ๋ฆฌ์†Œ์Šค ์กฐ์ž‘

RESTful API๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  HTTP ๋ฉ”์„œ๋“œ(GET,POST,PUT,DELETE)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ฃผ์š” ์›์น™์œผ๋กœ๋Š” ๋ฌด์ƒํƒœ์„ฑ, ์บ์‹ฑ, ๊ณ„์ธตํ™”, ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค, ์ž์ฒด ํ‘œํ˜„ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฌด์ƒํƒœ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ์ข‹์•„์ง€๊ณ , ์บ์‹ฑ์„ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. [์ค‘] REST์™€ SOAP์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

ํ”„๋กœํ† ์ฝœ : REST๋Š” HTTP ๊ธฐ๋ฐ˜, SOAP๋Š” XML ๊ธฐ๋ฐ˜์˜ ํ”„๋กœํ† ์ฝœ
๋ฐ์ดํ„ฐ ํ˜•์‹ : REST๋Š” JSON, XML ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•์‹ ์ง€์›, SOAP๋Š” XML๋งŒ ์‚ฌ์šฉ
์†๋„ ๋ฐ ํ™•์žฅ์„ฑ : REST๊ฐ€ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋ฉฐ ํ™•์ •์„ฑ์ด ๋†’์Œ, SOAP๋Š” ๋ณด์•ˆ๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์— ๊ฐ•์ 
์‚ฌ์šฉ ์‚ฌ๋ก€ : REST๋Š” ์›น ์„œ๋น„์Šค ๋ฐ ๋ชจ๋ฐ”์ผ ์•ฑ API, SOAP๋Š” ๊ธˆ์œต-๊ธฐ์—… ์‹œ์Šคํ…œ

REST๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ๊ตฌ์กฐ๋กœ JSON, XML ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์›ํ•˜๋ฉฐ, HTTP ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด SOAP๋Š” XML ๊ธฐ๋ฐ˜์˜ ํ”„๋กœํ† ์ฝœ๋กœ ๋ณด์•ˆ๊ณผ ํŠธ๋žœ์žญ์…˜์ด ์ค‘์š”ํ•œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. REST๋Š” ์›น ๋ฐ ๋ชจ๋ฐ”์ผ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•˜๊ณ  SOAP๋Š” ๊ธˆ์œต, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ ๋“ฑ ์‹ ๋ขฐ์„ฑ์ด ์š”๊ตฌ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ฃผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. [์ค‘] API ๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ๊ณผ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

API๋Š” ํ•œ ๋ฒˆ ๋ฐฐํฌ ๋˜๋ฉด ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ดํŠผ๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์‹œ์—๋„ ๊ธฐ์กด ์‚ฌ์šฉ์ž์˜ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด URL ๋ฒ„์ „๋ง, ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ๊ด€๋ฆฌ, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐฉ์‹ ๋“ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ „๋žต์œผ๋กœ๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์ถ”๊ฐ€, ๊ธฐ์กด ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ, ๋ณด์•ˆ ๊ฐœ์„ 
ํ•˜ํœ˜ ํ˜ธํ™˜์„ฑ์„ ๋ณด์กดํ•˜๋ฉด์„œ ๊ฐœ์„  ๋ฐฉ์‹
URL ๋ฒ„์ „๋ง (url์— v1, v2๋ฅผ ๋„ฃ์–ด์ฃผ๋Š”๋ฒ•)
ํ—ค๋” ๊ด€๋ฆฌ -> GrahQL์„ ์‚ฌ์šฉํ•  ๋•Œ ์“ด๋‹ค.

  1. [์ƒ] GraphQL๊ณผ REST API์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜๊ณ , ์‹ค๋ฌด์—์„œ ์–ด๋–ค ์ƒํ™ฉ์— ์ ํ•ฉํ•œ์ง€ ์ด์•ผ๊ธฐํ•ด์ฃผ์„ธ์š”.

REST๋Š” ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์ •ํ•ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, GraphQL์€ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. REST๋Š” ์บ์‹ฑ์ด ์šฉ์ดํ•˜๊ณ  ๋‹จ์ˆœํ•œ CRUD API์— ์ ํ•ฉํ•˜๋ฉฐ, GraphQL์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ฐ•์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด GraphQL, ํ‘œ์ค€์ ์ธ API ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” REST๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ฐฉ์‹์—์„œ ์ฒ˜๋ฆฌ,
REST๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ(์˜ค๋ฒ„ํŒจ์นญ)๊นŒ์ง€ ๋Œ๊ณ ์˜ค๋Š”๋ฐ GraphQL์€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์žฅ์ 
(์–ธ๋”ํŒจ์นญ) : 5๊ฐœ๋ฅผ ๊ฐ€์ ธ์™€์•ผ๋˜๋Š”๋ฐ 2๊ฐœ๋งŒ ๊ฐ€์ ธ์™”์„ ๋•Œ, ์ถ”๊ฐ€๋กœ 3๊ฐœ๋ฅผ ๊ฐ€์ ธ์™€์•ผ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์–ธ๋”ํŒจ์นญ

  1. [์ค‘] OAuth 2.0์ด ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

OAuth 2.0์€ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์—†์ด ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ

์ธ๊ฐ€๋ฐฉ์‹ 4๊ฐ€์ง€๊ฐ€ ์žˆ์Œ ์ธ๊ฐ€์ฝ”๋“œ, ์•”์‹œ์  ์ธ์ฆ ๋ฐฉ์‹

OAuth 2.0์€ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ์œ„์ž„์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ, ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…์„ ์ง์ ‘ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์—‘์„ธ์Šค ํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹์œผ๋กœ Authorization Code, Implicit, Client Credentials, Resource Owner Password Credentials๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด์•ˆ์„ฑ ๋†’์€ Authorzation COde ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. [์ค‘] HTTP ์ƒํƒœ ์ฝ”๋“œ ์ค‘ 200, 404, 500์˜ ์ฐจ์ด์™€ ๊ฐ๊ฐ์˜ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

200 OK : ์š”์ฒญ์ด ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ, 404 Not Found : ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ, 500 Internal Server Error : ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

  1. [์ƒ] ๋ฉฑ๋“ฑ์„ฑ(Idempotency)์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, API ์„ค๊ณ„ ์‹œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋ฉฑ๋“ฑ์„ฑ : ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ณด๋‚ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์†์„ฑ

๋ฉฑ๋“ฑ์„ฑ์ด๋ž€ ๋™์ผํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜๋Š” ์„ฑ์งˆ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด GET/user/1์€ ํ•ญ์ƒ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, PUT/user/1{name:"John"}๋„ ๋™์ผํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ณด๋‚ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, POST ์š”์ฒญ์€ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. [์ค‘] API ๋ฌธ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•(Spring REST Docs ๋“ฑ)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

API ๋ฌธ์„œ๋Š” ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์›ํ™œํ•œ ํ˜‘์—…๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ ์ด๋ฉฐ, ์ด๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Swagger, Spring REST Docs, Redoc๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์Šค์›จ๊ฑฐ : UI ๊ธฐ๋ฐ˜์˜ API ํ…Œ์ŠคํŠธ ๋ฐ ๋ฌธ์„œํ™” ์ œ๊ณต
Spring REST Docs : ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ๋ฌธ์„œํ™”, ๋งˆํฌ๋‹ค์šด ์ง€์›
Redos : ์˜คํ”ˆAPI ๋ฌธ์„œ๋ฅผ ์ •๋ฆฌํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„๋†’์€ ๋ฌธ์„œ ์ œ๊ณต

  1. [์ƒ] HATEOAS(Hypermedia as the Engine of Application State)๋ž€ ๋ฌด์—‡์ด๋ฉฐ, RESTful API์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

HATEOAS๋Š” ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด API ์‘๋‹ต์— "๋‹ค์Œ์— ๋ญ˜ ํ•˜๋ฉด ์ข‹์„์ง€"๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋งํฌ๋ฅผ ๊ฐ™์ด ํฌํ•จํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋ฉด ์ƒํ’ˆ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ณ„ ๊ด€๋ จ๋œ ์นดํ…Œ๊ณ ๋ฆฌ๋‚˜ ๋ฆฌ๋ทฐ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜์žˆ๋Š” ๋งํฌ๋„ ํฌํ•จํ•ด์„œ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด์ฃ . ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณ„๋„ ๋กœ API ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณผ ํ•„์š” ์—†์ด ์‘๋‹ต์„ ๋ณด๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์–ด์ง€๊ณ  API ํ™•์žฅ์—๋„ ์œ ๋ฆฌํ•œ ๊ตฌ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

RESTful API ์ „์†กํ• ๋•Œ HATEOAS ๋ฐฉ์‹์œผ๋กœ GET,POST ๋“ฑ URL ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—์„œ ์ „์†กํ•œ๋‹ค.
์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด ๋งํŠธ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹
ํด๋ผ๋ฆฌ์–ธํŠธ๋Š” API๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋งํฌ์™€ ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ƒํƒœ ์ „ํ™˜
URL ๋ณ€๊ฒฝ ์˜์กด๋„ โฌ‡๏ธ

  1. [์ƒ] HTTP/2์™€ HTTP/1.1์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

๋ฉ€ํ‹ฐ ํ”Œ๋ ‰์‹ฑ : HTTP/2๋Š” ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
ํ—ค๋” ์••์ถ• : HPACK์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋” ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋„คํŠธ์›Œํฌ ํšจ์œจ ๊ฐœ์„ 
์„œ๋ฒ„ ํ‘ธ์‹œ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฏธ๋ฆฌ ์ „์†ก ๊ฐ€๋Šฅ
์†๋„ ๊ฐœ์„  : HTTP/1.1 ๋Œ€๋น„ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค๊ณ  ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋จ
์‹ค๋ฌด์—์„œ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด HTTP/2๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ฉฐ, ํŠนํžˆ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ™˜๊ฒฝ์—์„œ ๋”์šฑ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

HTTP/1.1์—์„œ๋Š” ์š”์ฒญ์„ ํ•œ ๊ฐœ์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ด์„œ ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, HTTP/2๋Š” ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์„ ๋™์‹œ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ). ๋˜, ํ—ค๋”๋ฅผ ์••์ถ•ํ•ด์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ด๊ณ , ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ „์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ณด๋‚ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.(์„œ๋ฒ„ํ‘ธ์‹œ), ๊ทธ๋ž˜์„œ HTTP/2๋ฅผ ์ ์šฉํ•˜๋ฉด ์›น์‚ฌ์ดํŠธ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๊ณ  ์„ฑ๋Šฅ์ด ํ™•์‹คํžˆ ์ข‹์•„์ง„๋‹ค.

1.1์€ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ HOLB๊ฐ€ ๋ฐœ์ƒ
์ดํ›„ ๋ฌธ์ œ๋ฐœ์ƒ์‹œ, ํ›„์† ์š”์ฒญ๋“ค์ด ์ „์†ก๋˜์ง€ ๋ชปํ•˜๊ณ  ์ง€์—ฐ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๋„์ž…์„ ์œ„ํ•œ 2๊ฐ€ ๋‚˜์˜ด
ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋กœ ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์„ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ด์•„ ์ „๋‹ฌ (๋ฐ”์ด๋„ˆ๋ฆฌ ์ธ์ฝ”๋”ฉ)

profile
์งง๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ!

0๊ฐœ์˜ ๋Œ“๊ธ€