REST API - MoonGyeongHyeon/Keyword_Study GitHub Wiki

REST API

REST๋Š” REpresentational State Transfer์˜ ์•ฝ์ž๋กœ 2000๋…„๋„์— ๋กœ์ด ํ•„๋”ฉ์— ์˜ํ•ด ์ฒ˜์Œ ์†Œ๊ฐœ๋๋‹ค. ๋กœ์ด ํ•„๋”ฉ์€ HTTP์˜ ์ฃผ์š” ์ €์ž ์ค‘ ํ•œ ์‚ฌ๋žŒ์œผ๋กœ, ๋‹น์‹œ HTTP ์„ค๊ณ„์˜ ์šฐ์ˆ˜์„ฑ์— ๋น„ํ•ด ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์–ด์ง€์ง€ ๋ชปํ•˜๋Š” ๋ชจ์Šต์— ์•ˆํƒ€๊นŒ์›Œํ•˜์—ฌ ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ณ๋กœ REST๋ฅผ ๋ฐœํ‘œํ–ˆ๋‹ค.

REST์˜ ๊ตฌ์„ฑ

  • ์ž์› - URI
  • ํ–‰์œ„ - HTTP Method
  • ํ‘œํ˜„ (Representation)

REST์˜ ํŠน์ง•

  • Uniform (์œ ๋‹ˆํผ ์ธํ„ฐํŽ˜์ด์Šค)
    • URI๋กœ ์ง€์ •ํ•œ ์ž์›์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผ๋˜๊ณ  ํ•œ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ.
  • Stateless
    • REST๋Š” ๋ฌด์ƒํƒœ์„ฑ ์„ฑ๊ฒฉ์„ ๊ฐ–๋Š”๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์ž‘์—…์„ ์œ„ํ•œ ์ƒํƒœ์ •๋ณด๋ฅผ ๋”ฐ๋กœ ์ €์žฅ/๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์„ธ์…˜ ์ •๋ณด๋‚˜ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅ/๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— API ์„œ๋ฒ„๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ ๋‹จ์ˆœํžˆ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค. ๋•Œ๋ฌธ์—, ์„œ๋น„์Šค์˜ ์ž์œ ๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ์„œ๋ฒ„์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด์ง„๋‹ค.
  • Cacheable
    • REST์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” HTTP๋ผ๋Š” ๊ธฐ์กด ์›น ํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP๊ฐ€ ๊ฐ€์ง„ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. HTTP ํ”„๋กœํ† ์ฝœ ํ‘œ์ค€์—์„œ ์‚ฌ์šฉํ•˜๋Š” Last-Modified ํƒœ๊ทธ๋‚˜ E-Tag๋ฅผ ์ด์šฉํ•˜๋ฉด ์บ์‹ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Self-descriptiveness (์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ)
    • REST API ๋ฉ”์„ธ์ง€๋งŒ ๋ณด๊ณ ๋„ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • Client-Server ๊ตฌ์กฐ
    • REST ์„œ๋ฒ„๋Š” API ์ œ๊ณต, ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ ์ปจํ…์ŠคํŠธ(์„ธ์…˜, ๋กœ๊ทธ์ธ ์ •๋ณด) ๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ, ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ํ™•์‹คํžˆ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ๊ฐœ๋ฐœํ•  ๋‚ด์šฉ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ  ์„œ๋กœ์˜ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค.
  • ๊ณ„์ธตํ˜• ๊ตฌ์กฐ
    • REST ์„œ๋ฒ„๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณด์•ˆ, LB, ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•ด ๊ตฌ์กฐ ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ๋‘˜ ์ˆ˜ ์žˆ๊ณ  proxy, ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„ ๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

REST API ๊ฐ€์ด๋“œ

REST API ์„ค๊ณ„ ์‹œ ๋‹ค์Œ 2๊ฐ€์ง€ ํ•ญ๋ชฉ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค.

  1. URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•œ๋‹ค.
  2. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

REST API ์ค‘์‹ฌ ๊ทœ์น™

URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค. (์ž์›๋ช…์€ ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ)

GET /members/delete/1

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ REST๋ฅผ ์ œ๋Œ€๋กœ ์ ์šฉํ•˜์ง€ ์•Š์€ URI์ด๋‹ค. URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘์–ด์•ผ ํ•œ๋‹ค. delete์™€ ๊ฐ™์€ ํ–‰์œ„์— ๋Œ€ํ•œ ํ‘œํ˜„์ด ๋“ค์–ด๊ฐ€์„  ์•ˆ๋œ๋‹ค.

์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

์œ„์˜ ์ž˜๋ชป๋œ URI๋ฅผ HTTP Method๋กœ ์ˆ˜์ •ํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

DELETE /members/1

ํšŒ์›์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” GET, ํšŒ์›์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” POST๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.

ํšŒ์›์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” URI

GET /members/show/1     (x)
GET /members/1          (o)

ํšŒ์›์„ ์ถ”๊ฐ€ํ•  ๋•Œ URI

GET /members/insert/2 (x)  - GET ๋ฉ”์„œ๋“œ๋Š” ์ž์› ์ƒ์„ฑ์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
POST /members/2       (o)

POST, GET, PUT, DELETE 4๊ฐ€์ง€์˜ Method๋ฅผ ์‚ฌ์šฉํ•ด CRUD๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

METHOD ์—ญํ• 
POST POST๋ฅผ ํ†ตํ•ด ํ•ด๋‹น URI๋ฅผ ์š”์ฒญํ•˜๋ฉด ์ž์›์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
GET GET๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ž์›์„ ์กฐํšŒํ•˜๊ณ  ํ•ด๋‹น ๋„ํ๋จผํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
PUT PUT๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
DELETE DELETE๋ฅผ ํ†ตํ•ด ์ž์›์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ ์‹์œผ๋กœ URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ณ , ํ–‰์œ„์— ๋Œ€ํ•œ ์ •์˜๋Š” HTTP Method๋ฅผ ํ†ตํ•ด ํ•˜๋Š” ๊ฒƒ์ด REST API ์„ค๊ณ„์˜ ์ค‘์‹ฌ ๊ทœ์น™์ด๋‹ค.

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

  • ์Šฌ๋ž˜์‹œ(/)๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

    http://restapi.example.com/houses/apartments
    http://restapi.example.com/animals/mammals/whales
    
  • URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

    URI์— ํฌํ•จ๋˜๋Š” ๋ชจ๋“  ๊ธ€์ž๋Š” ์ž์›์˜ ์œ ์ผํ•œ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ, URI๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ์ž์›์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์—ญ์œผ๋กœ ์ž์›์ด ๋‹ค๋ฅด๋ฉด URI๋„ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค. REST API๋Š” ๋ถ„๋ช…ํ•œ URI๋ฅผ ๋งŒ๋“ค์–ด ํ†ต์‹ ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™์„ ์ฃผ์ง€ ์•Š๋„๋ก URI์˜ ๋งˆ์ง€๋ง‰์—๋Š” ์Šฌ๋ž˜์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

    http://restapi.example.com/houses/apartments/ (X)
    http://restapi.example.com/houses/apartments  (0)
    
  • ํ•˜์ดํ”ˆ(-)์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

    URI๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๊ธด URI ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ‘์ค„(_)์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ๊ธ€๊ผด์— ๋”ฐ๋ผ ๋ฐ‘์ค„์ด ๋ณด๊ธฐ ํž˜๋“ค๊ฑฐ๋‚˜ ๋ณด์ด์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฐ‘์ค„ ๋•Œ๋ฌธ์— ๋ฌธ์ž๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ‘์ค„ ๋Œ€์‹  ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•˜์ž.

  • URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.

    URI ๊ฒฝ๋กœ์— ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ์€ ํ”ผํ•˜๋„๋ก ํ•œ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URI์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

    http://restapi.example.com/members/soccer/345/photo.jpg (X)
    

    REST API์—์„œ๋Š” ๋ฉ”์„ธ์ง€ ๋ฐ”๋”” ๋‚ด์šฉ์˜ ํฌ๋งท์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ URI์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. Accept Header ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

    GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg
    

์ž์› ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

REST ์ž์› ๊ฐ„์—๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿด ๋• ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

/๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ์†Œ์Šค ID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช…

ex)    GET : /users/{userid}/devices (์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ์œ  โ€˜hasโ€™์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ)

๋งŒ์•ฝ ๊ด€๊ณ„๋ช…์ด ๋ณต์žกํ•˜๋‹ค๋ฉด ์ด๋ฅผ ์„œ๋ธŒ ์ž์›์— ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๋””๋ฐ”์ด์Šค ๋ชฉ๋ก์„ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

GET : /users/{userid}/likes/devices (๊ด€๊ณ„๋ช…์ด ์• ๋งคํ•˜๊ฑฐ๋‚˜ ๊ตฌ์ฒด์  ํ‘œํ˜„์ด ํ•„์š”ํ•  ๋•Œ)

์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” Collection๊ณผ Document

Collection๊ณผ Document์— ๋Œ€ํ•ด ์•Œ๋ฉด URI ์„ค๊ณ„๊ฐ€ ํ•œ ์ธต ๋” ์‰ฌ์›Œ์ง„๋‹ค. Document๋Š” ๋‹จ์ˆœํžˆ ๋ฌธ์„œ๋กœ ์ดํ•ดํ•ด๋„ ๋˜๊ณ , ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ผ๊ณ  ์ดํ•ดํ•ด๋„ ๋œ๋‹ค. Collection์€ ๋ฌธ์„œ๋“ค์˜ ์ง‘ํ•ฉ, ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. Collection๊ณผ Document๋Š” ๋ชจ๋‘ ์ž์›์ด๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ URI์— ํ‘œํ˜„๋œ๋‹ค.

http:// restapi.example.com/sports/soccer

์œ„ URI๋Š” sports๋ผ๋Š” Collection๊ณผ soccer๋ผ๋Š” Document๋กœ ํ‘œํ˜„๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

http:// restapi.example.com/sports/soccer/players/13

sports, players Collection๊ณผ 13(13๋ฒˆ ์„ ์ˆ˜)์„ ์˜๋ฏธํ•˜๋Š” Document๋กœ URI๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ Collection์€ ๋ณต์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ง๊ด€์ ์ธ REST API๋ฅผ ์œ„ํ•ด์„  Collection๊ณผ Document๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ์ˆ˜ ๋ณต์ˆ˜๋ฅผ ์ง€์ผœ์ค€๋‹ค๋ฉด ์ข€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด URI๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.