restful ์ด๋ฏธ์ง€

RESTful์ด๋ž€?

๋‘ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์ด ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์–‘ํ•œ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์„œ๋“œ ํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, RESTful API๋Š” ์•ˆ์ „ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํšจ์œจ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ํ†ต์‹  ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์ •๋ณด ๊ตํ™˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


RESTful์„ ์•Œ์•„๊ฐ€๊ธฐ ์ „ ์•Œ์•„๋‘์–ด์•ผ ํ•  REST๋ž€?

HTTP URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD OPERATION์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ฆ‰, REST๋Š” ์ž์› ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ(ROA: Resource Oriented Architecture) ์„ค๊ณ„์˜ ์ค‘์‹ฌ์— Resource๊ฐ€ ์žˆ๊ณ  HTTP Method๋ฅผ ํ†ตํ•ด Resource๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋œ ์•„ํ‚คํ…์ณ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์›น์˜ ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ ID์ธ HTTP URI๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.


REST์˜ ๊ตฌ์„ฑ

1. ์ž์›(Resource) - URI

  • ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ ID๊ฐ€ ์กด์žฌํ•˜๊ณ , ์ด ์ž์›์€ Server์— ์กด์žฌํ•œ๋‹ค.
  • ์ž์›์„ ๊ตฌ๋ณ„ํ•˜๋Š” ID๋Š” /Developer/id/sany์™€ ๊ฐ™์€ HTTP URI์ด๋‹ค.

2. ํ–‰์œ„ (Verb) - Http Method

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ Method๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • HTTP ํ”„๋กœํ† ์ฝœ์€ GET, POST, PUT, DELETE์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

3. ํ‘œํ˜„ (Representation of Resource)

  • Client๊ฐ€ ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ์š”์ฒญ(Request)ํ•˜๋ฉด Server๋Š” ์ด์— ์ ์ ˆํ•œ ์‘๋‹ต(Representation)์„ ๋ณด๋‚ธ๋‹ค.
  • REST์—์„œ ํ•˜๋‚˜์˜ ์ž์›์€ JSON, XML, TEXT, RSS ๋“ฑ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ Representation์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ˜„์žฌ๋Š” JSON์œผ๋กœ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด๋‹ค.

REST์˜ ํŠน์ง•

1. Server-Client(์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ)

2. Stateless(๋ฌด์ƒํƒœ)

3. Cacheable(์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)

4. Layered System(๊ณ„์ธตํ™”)

5. Uniform Interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)


REST์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ REST API ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ํ‘œ์ค€์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ถ”๊ฐ€์ ์ธ ์žฅ์ ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.
  • HTTP ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Hypermedia API์˜ ๊ธฐ๋ณธ์„ ์ถฉ์‹คํžˆ ์ง€ํ‚ค๋ฉด์„œ ๋ฒ”์šฉ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  • REST API ๋ฉ”์‹œ์ง€๊ฐ€ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„œ๋น„์Šค ๋””์ž์ธ์—์„œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค.
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค.

๋‹จ์ 

  • ํ‘œ์ค€์ด ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • HTTP Method ํ˜•ํƒœ๊ฐ€ ์ œํ•œ์ ์ด๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•  ์ผ์ด ๋งŽ์€ ์„œ๋น„์Šค๋ผ๋ฉด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” URL๋ณด๋‹ค Header ์ •๋ณด์˜ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „๋ฌธ์„ฑ์ด ์š”๊ตฌ๋œ๋‹ค.
  • ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š์•„ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋™์ž‘์ด ๋งŽ๋‹ค.(์ต์Šคํด๋กœ์–ด)

RESTful์˜ ๋ชฉ์ 

  • ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด REST API๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

  • RESTfulํ•œ API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์€ ์ผ๊ด€์ ์ธ ์ปจ๋ฒค์…˜์„ ํ†ตํ•œ API์˜ ์ดํ•ด๋„ ๋ฐ ํ˜ธํ™˜์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด๋‹ˆ, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๊ตณ์ด RESTfulํ•œ API๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†๋‹ค.


RESTful ํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ

  • Ex1) CRUD ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ POST๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” API
  • Ex2) route์— resource, id ์™ธ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ(/students/updateName)

RESTful API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ๋‚˜?

ํ™•์žฅ์„ฑ

REST API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹œ์Šคํ…œ์€ REST๊ฐ€ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ํฌ๊ธฐ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌด์ƒํƒœ๋Š” ์„œ๋ฒ„๊ฐ€ ๊ณผ๊ฑฐ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ๋กœ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

์ž˜ ๊ด€๋ฆฌ๋œ ์บ์‹ฑ์€ ์ผ๋ถ€ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋˜๋Š” ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ํ†ต์‹  ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ผ์œผํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ํ™•์žฅ์„ฑ์„ ์ง€์›ํ•œ๋‹ค.


์œ ์—ฐ์„ฑ

RESTful ์›น ์„œ๋น„์Šค๋Š” ์™„์ „ํ•œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ถ„๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

๊ฐ ๋ถ€๋ถ„์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ์„œ๋ฒ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋ถ„๋ฆฌํ•œ๋‹ค.

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”Œ๋žซํผ ๋˜๋Š” ๊ธฐ์ˆ  ๋ณ€๊ฒฝ์€ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ•จ์ˆ˜๋ฅผ ๊ณ„์ธตํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์œ ์—ฐ์„ฑ์„ ๋”์šฑ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.(Ex1 ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ„์ธต์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.)


๋…๋ฆฝ์„ฑ

REST API๋Š” ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ๊ณผ ๋…๋ฆฝ์ ์ด๋‹ค.

API ์„ค๊ณ„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ํ†ต์‹ ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์–‘์ชฝ์˜ ๊ธฐ๋ณธ ๊ธฐ์ˆ ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.


REST API ์„ค๊ณ„๊ทœ์น™

  1. URI๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ, ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
  2. ์Šฌ๋ž˜์‹œ( / )๋กœ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  3. URI์˜ ๋งˆ์ง€๋ง‰์—๋Š” ์Šฌ๋ž˜์‹œ( / )๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.
  4. ์–ธ๋”๋ฐ”( _ ) ๋Œ€์‹  ํ•˜์ดํฐ( - )์„ ์‚ฌ์šฉํ•œ๋‹ค.
  5. ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ ํ•˜์ดํ”ˆ( - )์„ ์‚ฌ์šฉํ•œ๋‹ค.
  6. ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž๋กœ URI๋ฅผ ์ •์˜ํ•˜๋ฉด ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ ์ž˜๋ชป ์ ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.
  7. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค

๋๋ง

REST API ์„ค๊ณ„๊ทœ์น™์„ ๋”ฐ๋ผ RESTfulํ•œ API๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€์ ์œผ๋กœ ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด ๋ณด๋Š” ๊ธ€์„ ์ž‘์„ฑํ•ด ๋ณด์•„์•ผ ๊ฒ ๋‹ค.

REST API๋Š” ๋™์‚ฌ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋กœ ์ž‘์„ฑํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


์šฉ์–ด์ •๋ฆฌ

API: ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๊ทœ์น™

REST(Representational State Transfer): API ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ๋ถ€๊ณผํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ -> REST API์™€ RESTful API๋Š” ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

CRUD Operation: CRUD๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ธ Create(์ƒ์„ฑ), Read(์ฝ๊ธฐ), Update(๊ฐฑ์‹ ), Delete(์‚ญ์ œ)๋ฅผ ๋ฌถ์–ด์„œ ์ผ์ปซ๋Š” ๋ง๋กœ REST์—์„œ์˜ CRUD Operation ๋™์ž‘ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Http Method์— ๋Œ€ํ•ด์„œ

  • Create : ๋ฐ์ดํ„ฐ ์ƒ์„ฑ(POST)
  • Read : ๋ฐ์ดํ„ฐ ์กฐํšŒ(GET)
  • Update : ๋ฐ์ดํ„ฐ ์ˆ˜์ •(PUT, PATCH)
  • Delete : ๋ฐ์ดํ„ฐ ์‚ญ์ œ(DELETE)
  • HEAD : header ์ •๋ณด ์กฐํšŒ(HEAD)

๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ: ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์—…๋ฌด ํ˜น์€ ์š”์ฒญ(Load)์„ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋กœ ๋‚˜๋ˆ„์–ด(Balancing) ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

PROXY ์„œ๋ฒ„: ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๋กœ ์ง์ ‘ ํ†ต์‹  ํ•  ์ˆ˜ ์—†์„๋•Œ ์ค‘๊ณ„ ํ•ด์ฃผ๋Š” ์„œ๋ฒ„

๊ฒŒ์ดํŠธ์›จ์ด: ํ•œ ๋„คํŠธ์›Œํฌ(segment)์—์„œ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ์ง€์ , ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ(๊ธฐ์ข…์ด ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ)๋ฅผ ์—ฐ๊ฒฐ


์ฐธ๊ณ ๋งํฌ

RESTful API๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Day1, 2-2. ๊ทธ๋Ÿฐ REST API๋กœ ๊ดœ์ฐฎ์€๊ฐ€

[Network] REST๋ž€? REST API๋ž€? RESTful์ด๋ž€?

RESTful Api๋ž€