๐Ÿ“‹ REST API์— ๋Œ€ํ•˜์—ฌ


REST API

  • ์˜ค๋Š˜๋‚  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์›น ์„œ๋น„์Šค ์œ ํ˜• ์ค‘ ํ•˜๋‚˜
  • ๋ธŒ๋ผ์šฐ์ € ์•ฑ์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ REST API๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ํ†ต์‹ 
  • stateless ํ†ต์‹  ๋ฐ ์บ์‹œ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ™์€ ํŠน์ • ์•„ํ‚คํ…์ฒ˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค
  • ํ”„๋กœํ† ์ฝœ์ด๋‚˜ ํ‘œ์ค€์ด ์•„๋‹˜
  • ์—ฌ๋Ÿฌ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ HTTPS๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋จ

REST API ๊ตฌ์„ฑ

REST : Representational State Transfer๋ผ๋Š” ์šฉ์–ด์˜ ์•ฝ์ž

  • ์ž์› : URI
  • ํ–‰์œ„ : HTTP METHOD
  • ํ‘œํ˜„

REST ์˜ ํŠน์ง•

  • Uniform Interface
  • Stateless
  • Caching
  • Client-Server
  • Hierarchical system
  • Code on demand

REST API ๋””์ž์ธ ๊ฐ€์ด๋“œ

URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ง‘์ค‘ํ•˜๊ณ  ํ–‰์œ„์— ๋Œ€ํ•œ ์ •์˜๋Š” HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค : ๋ฆฌ์†Œ์Šค๋ช…์€ ๋™์‚ฌ๋ณด๋‹ค ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP ๋ฉ”์†Œ๋“œ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

URI ์„ค๊ณ„ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

  • ์Šฌ๋ž˜์‹œ (/)๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ธด URL ๊ฒฝ๋กœ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฐ‘์ค„(_)์€ URL์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • URL์€ ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URI์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

๋ฆฌ์†Œ์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • /๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ์†Œ์Šค ID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช…
  • ๊ด€๊ณ„๋ช…์ด ๋ณต์žกํ•  ๊ฒฝ์šฐ ์„œ๋ธŒ ๋ฆฌ์†Œ์Šค์— ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ex) GET : /users/{userid}/likes/devices

Colllection๊ณผ Document

  • Colllection : ๋ฌธ์„œ๋“ค์˜ ์ง‘ํ•ฉ, ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ. ๋ณต์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • Document : ๋‹จ์ˆœํ•œ ๋ฌธ์„œ ํ˜น์€ ํ•œ ๊ฐ์ฒด
/games/{id}/score
/games/{id}/load
/games/{id}/move

HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ

200

  • 200 : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•จ
  • 201 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์„ ์š”์ฒญ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋จ(POST๋ฅผ ํ†ตํ•œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์ž‘์—… ์‹œ)

400

  • 400 : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋ถ€์ ์ ˆ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
  • 401 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
  • 403 : ์œ ์ € ์ธ์ฆ์ƒํƒœ์™€ ๊ด€๊ณ„ ์—†์ด ์‘๋‹ตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
  • 404 : ์„œ๋ฒ„๊ฐ€ ์š”์ฒญํ•œ ํŽ˜์ด์ง€(Resource)๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ

ect

  • 301 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ URI๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
  • 500 : ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ

์ฐธ๊ณ 

REST API ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ : NHN Cloud Meetup


โ“ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋กœ ์š”์ฒญํ•˜์—ฌ DB์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์‹œ ์–ด๋–ค ์ƒํƒœ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค์ฃผ์–ด์•ผ ํ•˜๋‚˜?

์„œ๋ฒ„์—์„œ SQLException์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์•ผ ํ•˜๋‚˜,
๋˜๋Š” ์–ด๋–ค ์ƒํƒœ์ฝ”๋“œ๋ฅผ ์ฃผ์–ด์•ผ ํ•˜๋‚˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด์•˜๋‹ค.

์ผ๋‹จ ๊ฒฐ๋ก ์€ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋กœ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์„œ๋ฒ„์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ ๋•Œ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ƒํƒœ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค์ค€๋‹ค.
์›น API ๋””์ž์ธ์„ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

POST - ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์š”์ฒญ์ผ ๊ฒฝ์šฐ 400

PUT - ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ 409

์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ƒํƒœ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ผ ๋•Œ ์ •ํ•ด์ง„ ์•ฝ์†์„ ์ƒ๊ฐํ•ด๋ณด๊ณ  ์ ์ ˆํ•œ ์ƒํƒœ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์–ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž!


REST API ์„ค๊ณ„๋ฅผ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

2021-06-09 ์ถ”๊ฐ€

JSON์œผ๋กœ accept์™€ respond

  • JSON์€ ๋ฐ์ดํ„ฐ ์ „์†ก์„์œ„ํ•œ ํ‘œ์ค€
  • JS์˜ Fetch API ๋“ฑ์€ JSON์„ ์ธ์ฝ”๋”ฉ ๋ฐ ๋””์ฝ”๋”ฉํ•˜๋Š” ๋‚ด์žฅ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Œ
  • JSON์œผ๋กœ ์‘๋‹ต ํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€์ด๋ฅผ ํ•ด์„ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด Content-Type: application/json ๋ฅผ ์‘๋‹ต ํ—ค๋”๋กœ ์„ค์ •ํ•ด์•ผํ•จ

๋™์‚ฌ๋Œ€์‹  ๋ช…์‚ฌ ์‚ฌ์šฉ

  • HTTP ์š”์ฒญ ๋ฉ”์„œ๋“œ์— ์ด๋ฏธ ๋™์‚ฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ
  • ๋™์‚ฌ๊ฐ€์žˆ๋Š” ๊ฒƒ์€ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ธธ์–ด์ง

๋…ผ๋ฆฌ์  ์ค‘์ฒฉ ์‚ฌ์šฉ

  • ํ•œ ๊ฐœ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋ฅผ ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ์ด๋ฅผ ๋ฐ˜์˜
  • ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ด€๊ณ„์—†์ด ๋””์ž์ธํ•˜๊ธฐ
    • ์‹ค์ œ๋กœ ๊ณต๊ฒฉ์ž์—์„ธ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋„๋ก ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋Ÿฌ๋ง ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ

ํ‘œ์ค€ ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ฐ˜ํ™˜

  • ์˜ค๋ฅ˜ ์ฝ”๋“œ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๋„๋ก ๋ฉ”์‹œ์ง€๊ฐ€ ํ•จ๊ป˜ ์žˆ์–ด์•ผ ํ•จ
  • ํ•˜์ง€๋งŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฅผ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Œ

์ผ๋ฐ˜์ ์ธ HTTP ์˜ค๋ฅ˜ ์ƒํƒœ์ฝ”๋“œ

  • 400 : ํด๋ผ์ด์–ธํŠธ ์ธก ์ž…๋ ฅ์ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจ
  • 401 : ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค ํ•  ์ˆ˜์žˆ๋Š” ๊ถŒํ•œ์ด ์—†์Œ
  • 403 : ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜์—ˆ์ง€๋งŒ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Œ
  • 404 : ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ
  • 500 : ์ผ๋ฐ˜ ์„œ๋ฒ„ ์˜ค๋ฅ˜. ๋ช…์‹œ์ ์œผ๋กœ ๋˜์ ธ์„œ๋Š” ์•ˆ๋จ
  • 503 : ์„œ๋ฒ„ ์ธก์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ผ์ด ๋ฐœ์ƒํ–ˆ์Œ (์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜, ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€ ์˜ค๋ฅ˜ ๋“ฑ)

๋ณด์•ˆ

  • SSL ์ธ์ฆ์„œ๋Š” ์„œ๋ฒ„์—๋กœ๋“œํ•˜๊ธฐ๊ฐ€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์œผ๋ฉฐ ๋น„์šฉ์ด ๋ฌด๋ฃŒ์ด๊ฑฐ๋‚˜ ๋งค์šฐ ๋‚ฎ์Œ
  • ๋•Œ๋ฌธ์— SSL์œ„์—์„œ ๊ตฌ๋™๋˜๋Š” HTTPS๋ฅผ ์ด์šฉํ•˜์ž
  • ์‚ฌ์šฉ์ž๋“ค์ด ์„œ๋กœ์˜ ์ •๋ณด์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†๋„๋ก ๋ง‰์•„์•ผ ํ•จ

์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์บ์‹ฑ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜๋Š” ๋Œ€์‹ 
  • ๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์บ์‹ฑ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋•๋ถ„์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ๋นจ๋ฆฌ ์–ป์„ ์ˆ˜ ์žˆ์Œ
  • ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์–ป๋Š” ๋ฐ์ดํ„ฐ๋Š” ์˜ค๋ž˜๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Œ (๋ฌธ์ œ)
  • Redis, ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹ฑ๋˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
  • ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Cache-Controlํ—ค๋” ์—๋„ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์•ผํ•จ

API ๋ฒ„์ „ ๊ด€๋ฆฌ

  • API์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ฒจ ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ API๊ฐ€ ์žˆ์–ด์•ผ ํ•จ
  • v1 ์—”๋“œ ํฌ์ธํŠธ๋Š” ๋ณ€๊ฒฝ์„ ์›ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ์œ ์ง€
  • v2๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ค€๋น„๊ฐ€ ๋œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต
  • ๋ฒ„์ „์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ /v1/, /v2/๋“ฑ API ๊ฒฝ๋กœ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ถ”๊ฐ€

์ฐธ๊ณ 


โž• API ์„ค๊ณ„์— ๋Œ€ํ•œ ์ •ํ•ด์ง„ ๊ทœ์•ฝ?

  • API๋ฅผ ํ™œ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ์ถฉ๋ถ„ํ•œ ๋…ผ์˜ ํ›„ ๊ฒฐ์ •ํ•˜๊ธฐ
  • ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ๊ณต๊ฐ
  • RFC ๋ฌธ์„œ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค ์‚ฌ์šฉํ•˜๋Š” API์„ค๊ณ„ ํ™œ์šฉ