[์ปดํ“จํ„ฐ๋„คํŠธ์›Œํฌ] REST์™€ RESTful

๐Ÿงช Computer Science/Computer Network

REST

REST์˜ ์ •์˜

  • 'REpresentational State Transfer(๋Œ€ํ‘œ์ ์ธ ์ƒํƒœ ์ „๋‹ฌ)'์˜ ์•ฝ์ž

  • World Wide Web(WWW)๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ ํ˜•์‹

    • REST๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น์˜ ๊ธฐ์กด ๊ธฐ์ˆ ๊ณผ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด๋‹ค.
    • REST๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ Client์™€ Server ์‚ฌ์ด์˜ ํ†ต์‹  ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

REST์˜ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…

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

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

  • ์›น ์‚ฌ์ดํŠธ์˜ ์ด๋ฏธ์ง€, ํ…์ŠคํŠธ, DB ๋‚ด์šฉ ๋“ฑ์˜ ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ ID์ธ HTTP URI๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.


REST์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

  • ์žฅ์ 

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

    • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ์€ ์„œ๋น„์Šค๋ผ๋ฉด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” URL๋ณด๋‹ค Header ๊ฐ’์ด ๋” ์–ด๋ ต๋‹ค.
    • ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„์ง ์ œ๋Œ€๋กœ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค.
      • PUT, DELETE๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ์ 
      • pushState๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ 

REST๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ„๋ฆฌ ๋ฐ ํ†ตํ•ฉ

  • ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ๋“ฑ์žฅ

  • ์ฆ‰, ์ตœ๊ทผ์˜ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์™€ ์•ˆ๋“œ๋กœ์ด๋“œํฐ, ์•„์ดํฐ๊ณผ ๊ฐ™์€ ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค์—์„œ๋„ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.


REST ๊ตฌ์„ฑ ์š”์†Œ

  • ์ž์›(Resource): URI๋กœ ์ž์›์— ์ ‘๊ทผ

    • ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ ID๊ฐ€ ์กด์žฌํ•˜๊ณ , ์ด ์ž์›์€ Server์— ์กด์žฌํ•œ๋‹ค.
    • ์ž์›์„ ๊ตฌ๋ณ„ํ•˜๋Š” ID๋Š” 'groups/:group_id'์™€ ๊ฐ™์€ HTTP URI๋‹ค.
    • Client๋Š” URI๋ฅผ ์ด์šฉํ•ด์„œ ์ž์›์„ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)์— ๋Œ€ํ•œ ์กฐ์ž‘์„ Server์— ์š”์ฒญํ•œ๋‹ค.
  • ํ–‰์œ„(Verb): HTTP Method

    • HTTP ํ”„๋กœํ† ์ฝœ์˜ Method๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • HTTP ํ”„๋กœํ† ์ฝœ์€ GET, POST, PUT, DELETE, HEAD์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ํ‘œํ˜„(Representation of Resource)

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

REST ํŠน์ง•

  • Client-Server(ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ)
  • Stateless(๋ฌด์ƒํƒœ)
  • Cacheable(์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)
  • Layered System(๊ณ„์ธตํ™”)
  • Code-On-Demand(optional)
  • Uniform Interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)


REST API

REST API์˜ ์ •์˜

  • REST ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ

  • ์ตœ๊ทผ OpenAPI, ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” ์—…์ฒด ๋Œ€๋ถ€๋ถ„์€ REST API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


REST API์˜ ํŠน์ง•

  • ์‚ฌ๋‚ด ์‹œ์Šคํ…œ๋“ค๋„ REST ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์Šคํ…œ์„ ๋ถ„์‚ฐํ•ด ํ™•์žฅ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ์šด์šฉ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • REST๋Š” HTTP ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ, HTTP๋ฅผ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋กœ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฆ‰, REST API๋ฅผ ์ œ์ž‘ํ•˜๋ฉด ๋ธํŒŒ์ด ํด๋ผ์ด์–ธํŠธ ๋ฟ ์•„๋‹ˆ๋ผ ์ž๋ฐ”, C#, ์›น ๋“ฑ์„ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.


REST API ์„ค๊ณ„ ๊ธฐ๋ณธ ๊ทœ์น™

  • URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Methond(GET, POST, PUT, DELETE)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

  • ํ•˜์ดํ”ˆ(-)์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉ

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

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

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

  • ๋ฆฌ์†Œ์Šค ๊ฐ„์—๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ '/'

  • :id๋Š” ํ•˜๋‚˜์˜ ํŠน์ • resource๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณ ์œ ๊ฐ’



RESTful

RESTful์˜ ๊ฐœ๋…

  • ์ผ๋ฐ˜์ ์œผ๋กœ REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์ด๋‹ค.

    • ์ฆ‰, REST ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์€ RESTful์ด๋ž€ ์šฉ์–ด๋กœ ์ง€์นญ๋œ๋‹ค.
  • RESTful์€ REST๋ฅผ REST๋‹ต๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.


RESTful์˜ ๋ชฉ์ 

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

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


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

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