Skip to content

Latest commit

ย 

History

History
97 lines (77 loc) ยท 6.18 KB

File metadata and controls

97 lines (77 loc) ยท 6.18 KB

REST API

1. REST API์˜ ์ดํ•ด์™€ ์„ค๊ณ„.


1-๊ฐœ๋… ์†Œ๊ฐœ.

REST๋Š” ์›น์˜ ์ฐฝ์‹œ์ž(HTTP) ์ค‘์˜ ํ•œ ์‚ฌ๋žŒ์ธ Roy Fielding์˜ 2000๋…„ ๋…ผ๋ฌธ์— ์˜ํ•ด์„œ ์†Œ๊ฐœ๋˜์—ˆ๋‹ค. ํ˜„์žฌ์˜ ์•„ํ‚คํ…์ณ๊ฐ€ ์›น์˜ ๋ณธ๋ž˜ ์„ค๊ณ„์˜ ์šฐ์ˆ˜์„ฑ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ณ๋ฅผ ์†Œ๊ฐœํ–ˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ Representational safe transfer (REST)์ด๋‹ค.

1.1. REST์˜ ๊ธฐ๋ณธ.


REST๋Š” ์š”์†Œ๋กœ๋Š” ํฌ๊ฒŒ ๋ฆฌ์†Œ์Šค, ๋ฉ”์„œ๋“œ, ๋ฉ”์„ธ์ง€ 3๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ "์ด๋ฆ„์ด Terry์ธ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•œ๋‹ค." ๋ผ๋Š” ํ˜ธ์ถœ์ด ์žˆ์„ ๋•Œ, "์‚ฌ์šฉ์ž"๋Š” ์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์†Œ์Šค, "์ƒ์„ฑํ•œ๋‹ค"๋ผ๋Š” ํ–‰์œ„๋Š” ๋ฉ”์„œ๋“œ, ๊ทธ๋ฆฌ๊ณ  "์ด๋ฆ„์ด Terry์ธ ์ƒ์š”์ž๋Š”"๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋œ๋‹ค. ์ด๋ฅผ REST ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•ด๋ณด๋ฉด, HTTP POST , http://myweb/users/

{
  "user":{
     "name":"terru"
  }
}

์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์ƒ์„ฑํ•œ๋‹ค์˜ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๋ฉ”์„œ๋“œ๋Š” HTTP Post ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜๊ณ , ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ์ด ๋˜๋Š” ์‚ฌ์šฉ์ž ๋ผ๋Š” ๋ฆฌ์†Œ์Šค๋Š” http://myweb/users ๋ผ๋Š” ํ˜•ํƒœ์˜ URI๋กœ ํ‘œํ˜„์ด ๋˜๋ฉฐ, ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๋””ํ…Œ์ผํ•œ ๋‚ด์šฉ์€ JSON ๋ฌธ์„œ๋ฅผ ์ด์šฉํ•ด์„œ ํ‘œํ˜„๋œ๋‹ค.

1.2. HTTP ๋ฉ”์„œ๋“œ


REST์—์„œ๋Š” ์•ž์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ•œ๋ฐ”์™€ ๊ฐ™์ด, ํ–‰์œ„์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. HTTP์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ REST์—์„œ๋Š” CRUD(Create Read Update Delete)์— ํ•ด๋‹น ํ•˜๋Š” 4๊ฐ€์ง€์˜ ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฉ”์„œ๋“œ ์˜๋ฏธ Idempotent
POST Create No
GET Select Yes
PUT Update Yes
DELETE Delete Yes

๊ฐ๊ฐ Post, Put, Get, Delete๋Š” ๊ฐ๊ฐ์˜ CRUD ๋ฉ”์„œ๋“œ์— ๋Œ€์‘๋œ๋‹ค. ์—ฌ๊ธฐ์— Idempotent๋ผ๋Š” ๋ถ„๋ฅ˜๊ฐ€ ์ถ”๊ฐ€ ํ–ˆ๋Š”๋ฐ, Idempotent๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰์„ ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, a++ ๋Š” Idempotent ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ•˜์ง€๋งŒ(ํ˜ธ์ถœ์‹œ๋งˆ๋‹ค ๊ฐ’์ด ์ฆ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—), a=4์™€ ๊ฐ™์€ ๋ช…๋ น์€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด๋„ Idempotentํ•˜๋‹ค.(๊ฐ’์ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—)

POST ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, Idempotentํ•˜์ง€ ์•Š์ง€๋งŒ ๋‚˜๋จธ์ง€ GET, PUT, DELETE๋Š” ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•ด๋„ Idempotent ํ•˜๋‹ค. GET ์˜ ๊ฒฝ์šฐ, ๊ฒŒ์‹œ๋ฌผ์˜ ์กฐํšŒ์ˆ˜ ์นด์šดํŠธ๋ฅผ ๋Š˜๋ ค์ค€๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ๋Š” Idempotentํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋กœ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. Idempotent์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์™œ ์„ค๋ช…์„ ํ•˜๋ƒ ํ•˜๋ฉด, REST๋Š” ๊ฐ ๊ฐœ๋ณ„ API๋ฅผ ์ƒํƒœ ์—†์ด ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ, ํ•ด๋‹น REST API๋ฅผ ๋‹ค๋ฅธ API์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋‹ค๊ฐ€ ์‹คํŒจํ•˜์˜€์„ ๊ฒฝ์šฐ, ํŠธ๋ Œ์ ์…˜ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด์„œ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, Idempotent ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋“ค์˜ ๊ฒฝ์šฐ๋Š” ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์›๋ณตํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ, Idempotentํ•œ ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‹ค์‹œ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ๋ฅผ ํ•˜๋Š” API๊ฐ€ ์žˆ์„๋•Œ, ์กฐํšŒ์‹œ ๋งˆ๋‹ค ์กฐํšŒ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ์ด ๋ฉ”์‹œ๋“œ๋ฅผ Idempotent ํ•˜๋‹ค๊ณ  ๋ณผ์ˆ˜ ์—†๊ณ , ์กฐํšŒ๋ฅผ ํ•˜๋‹ค๊ฐ€ ์‹คํŒจํ•˜์˜€์„ ๋•Œ๋Š” ์˜ฌ๋ผ๊ฐ„ ์กฐํšŒ์ˆ˜๋ฅผ ๋‹ค์‹œ -1๋กœ ๋นผ์ค˜์•ผ ํ•œ๋‹ค. ์ฆ‰, idempotenํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ํŠธ๋ Œ์ ์…˜์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณ„๋‹ค๋ฅธ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

1.3. REST์˜ ๋ฆฌ์†Œ์Šค.


REST๋Š” ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ์ด๋ผ๋Š” ์ •์˜ ๋‹ต๊ฒŒ ๋ชจ๋“  ๊ฒƒ์„ ๋ฆฌ์†Œ์Šค ์ฆ‰ ๋ช…์‚ฌ๋กœ ํ‘œํ˜„์„ ํ•˜๋ฉฐ, ๊ฐ ์„ธ๋ถ€ ๋ฆฌ์†Œ์Šค์—๋Š” id ๋ฅผ ๋ถ™์ธ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๋ผ๋ฅธ ๋ฆฌ์†Œ์Šค ํƒ€์ž…์„ http://myweb//user ๋ผ๊ณ  ์ •์˜ํ–ˆ๋‹ค๋ฉด, terry๋ผ๋Š” id๋ฅผ ๊ฐ–๋Š” ๋ฆฌ์†Œ์Šค๋Š” http://myweb/users/terry ๋ผ๋Š” ํ˜•ํƒœ๋กœ ์ •์˜ํ•œ๋‹ค. REST์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ช…์‚ฌ์˜ ํ˜•ํƒœ๋ฅผ ๋„์šฐ๋‹ค ๋ณด๋‹ˆ, ๋ช…๋ น(Operation)์„ฑ์˜ API๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์—์„œ ํ˜ผ๋ˆ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ "Push ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค"๋Š” ๋ณดํ†ต ๊ธฐ์กด์˜ RPC(Remote Procedure Call)์ด๋‚˜ ํ•จ์ˆ˜์„ฑ ์ ‘๊ทผํ•ด์„œ๋Š” /myweb/sendpush ํ˜•ํƒœ๋กœ ์ž˜๋ชป ์ •์˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๋™์‚ฌํ˜•์„ ๋ช…์‚ฌํ˜•์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์ ์šฉํ•ด๋ณด๋ฉด ๋ฆฌ์†Œ์Šค ํ˜•ํƒœ๊ฐ€ ํ‘œํ˜„ํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ์ˆ˜์›”ํ•ด์ง„๋‹ค. "Push ๋ฉ”์‹œ์ง€ ์š”์ฒญ์„ ์ƒ์„ฑํ•œ๋‹ค."๋ผ๋Š” ํ˜•ํƒœ๋กœ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด, API ํฌ๋งท์€ POST/myweb/push ํ˜•ํƒœ์™€ ๊ฐ™์ด ๋ช…์‚ฌํ˜•์œผ๋กœ ์ •์˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋ช…๋ น์ด ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋˜๋„๋ก์ด๋ฉด ๋ฆฌ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๋ช…์‚ฌ ํ˜•ํƒœ๋กœ ์ •์˜๋ฅผ ํ•˜๋Š”๊ฒŒ RESTํ˜•ํƒœ์˜ ๋””์ž์ธ์ด ๋œ๋‹ค.

REST API์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ, ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„๋‹จํ•œ REST API์˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ์ƒ์„ฑ API๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

  • ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋‹ค์Œ์€ http://myweb/users ๋ผ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ด๋ฆ„์€ terry, ์ฃผ์†Œ๋Š” seoul ์ด๋ผ๋Š” ๋‚ด์šฉ(๋ฉ”์‹œ์ง€)๋กœ HTTP Post ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๋Š” ์ •์˜์ด๋‹ค.
HTTP Post, http://myweb/users/
{
  "name":"terry",
  "address":"seoul"
}

1.4. ์กฐํšŒ.


๋‹ค์Œ์€ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค ์ค‘์—์„œ http://myweb/users ๋ผ๋Š” ์‚ฌ์šฉ์ž ๋ฆฌ์†Œ์Šค์ค‘์—, id๊ฐ€ terry ์ธ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค. ์กฐํšŒ์ด๊ธฐ ๋•Œ๋ฌธ์—, HTTP Get์„ ์‚ฌ์šฉํ•œ๋‹ค. HTTP Get, http://myweb/users/terry ์—…๋ฐ์ดํŠธ ๋‹ค์Œ์€ http://myweb/users ๋ผ๋Š” ์‚ฌ์šฉ์ž ๋ฆฌ์†Œ์Šค์ค‘์—, id๊ฐ€ terry ์ธ ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋Œ€ํ•ด์„œ, ์ฃผ์†Œ๋ฅผ โ€œsuwonโ€์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ˆ˜์ •์€ HTTP ๋ฉ”์„œ๋“œ ์ค‘์— PUT์„ ์‚ฌ์šฉํ•œ๋‹ค.

HTTP PUT, http://myweb/users/terry
{
  "name":"terry",
  "address":"suwon"
}

1.5. ์‚ญ์ œ.


๋งˆ์ง€๋ง‰์œผ๋กœ http://myweb/users ๋ผ๋Š” ์‚ฌ์šฉ์ž ๋ฆฌ์†Œ์Šค์ค‘์—, id๊ฐ€ terry ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. HTTP DELETE, http://myweb/users/terry

API ์ •์˜๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•˜๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฆฌ์˜์“ฐ๋ฅผ URI๋กœ ์ •ํ•ด์ค€ ํ›„์—, ๊ฑฐ๊ธฐ์— HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ CRUD๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ JSON์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ HTTP Body์— ์‹ค์–ด ๋ณด๋‚ด๋ฉด ๋œ๋‹ค. POST URI์— ๋ฆฌ์†Œ์Šค id๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋นผ๋ฉด ํฌ๊ฒŒ ์‹ ๊ฒฝ์“ธ ๋ถ€๋ถ„์ด ์—†๋‹ค.