REST

REST์˜ ๊ฐœ๋… 


REST๋ž€? 

Representational State Transfer์˜ ์•ฝ์ž 
์›น์˜ ๊ธฐ์กด ๊ธฐ์ˆ ๊ณผ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ 
๋„คํŠธ์›Œํฌ ์ƒ์—์„œ Client์™€ Server ์‚ฌ์ด์˜ ํ†ต์‹  ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜ 
์ž์›์„ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธ 
JSON ํ˜น์€ XML์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์  

 

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

  • HTTP URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•ด CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • ์ฆ‰, ์ž์› ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ(ROA) ์„ค๊ณ„์˜ ์ค‘์‹ฌ์— Resource๊ฐ€ ์žˆ์œผ๋ฉฐ, HTTP Method๋ฅผ ํ†ตํ•ด Resource๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋œ ์•„ํ‚คํ…์ฒ˜

 

CRUD Operation

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

 

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


์žฅ์  

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

 

๋‹จ์  

  • ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•œ์ •์ 
  • ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„์ง ์ œ๋Œ€๋กœ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌ(PUT,DELETE ์‚ฌ์šฉ ๋ถˆ๊ฐ€, pushState ์ง€์› ์•ˆํ•จ) 

 

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

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

 

 

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


Resource

  • ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ ID๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ์ž์›์€ ์„œ๋ฒ„์— ์กด์žฌ 
  • ์ž์›์„ ๊ตฌ๋ณ„ํ•˜๋Š” ID๋Š” '/users/:user_id'์™€ ๊ฐ™์€ HTTP URI 
  • Client๋Š” URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ์ง€์ •ํ•˜๊ณ , ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•จ 

 

Verb

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ Method๋ฅผ ์‚ฌ์šฉํ•จ 

 

Representation of Resource 

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

 

REST์˜ ํŠน์ง• 


Server-Client 

  • REST Server : API๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅ์„ ์ฑ…์ž„ 
  • Client : ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ context(์„ธ์…˜, ๋กœ๊ทธ์ธ ์ •๋ณด) ๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ณ  ์ฑ…์ž„์ง

 

Stateless 

  • HTTP ํ”„๋กœํ† ์ฝœ์€ Stateless Protocol์ด๋ฏ€๋กœ REST ์—ญ์‹œ ๋ฌด์ƒํƒœ์„ฑ์„ ๊ฐ€์ง 
  • Client์˜ context๋ฅผ Server์— ์ €์žฅํ•˜์ง€ ์•Š์Œ 
  • Server๋Š” ๊ฐ๊ฐ์˜ ์š”์ฒญ์„ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•จ 

 

Cacheable 

  • ์›น ํ‘œ์ค€ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ 
  • ์ฆ‰, HTTP๊ฐ€ ๊ฐ€์ง„ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉ ๊ฐ€๋Šฅ 

 

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

  • Client๋Š” REST API Server๋งŒ ํ˜ธ์ถœ 
  • REST server๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ 
  • API Server๋Š” ์ˆœ์ˆ˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ์•ž๋‹จ์— ๋ณด์•ˆ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™”, ์‚ฌ์šฉ์ž ์ธ์ฆ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ์ค„ ์ˆ˜ ์žˆ์Œ 
  • PROXY, ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„ ๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

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

  • URI๋กœ ์ง€์ •ํ•œ Resource์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผ๋˜๊ณ  ํ•œ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰ 
  • ํŠน์ • ์–ธ์–ด๋‚˜ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š์Œ

 

REST API์˜ ๊ฐœ๋… 


API 

๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์˜ ์ง‘ํ•ฉ์„ ์ œ๊ณตํ•˜์—ฌ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ์ด‰์ง„ํ•˜๋ฉฐ, ์„œ๋กœ ์ •๋ณด๋ฅผ ๊ตํ™˜ ๊ฐ€๋Šฅ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ 

REST API 

REST ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค API๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ 
์ตœ๊ทผ Open API(๊ตฌ๊ธ€ ๋งต, ๊ณต๊ณต ๋ฐ์ดํ„ฐ), ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค(ํ•˜๋‚˜์˜ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ชผ๊ฐœ์–ด ๋ณ€๊ฒฝ๊ณผ ์กฐํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“  ์•„ํ‚คํ…์ฒ˜) ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” ์—…์ฒด ๋Œ€๋ถ€๋ถ„ REST API๋ฅผ ์ œ๊ณต 

 

REST API์˜ ํŠน์ง• 

  • HTTP๋ฅผ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋กœ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ 

 

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


 

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

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

2. URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. 

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

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

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

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

6. ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URI์— ํ‘œํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • REST API์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ๋‚ด์šฉ์˜ ํฌ๋งท์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ URI์— ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋Œ€์‹  Accept header๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Ex) GET / members/soccer/345/photo HTTP/1.1 HOST : restapi.example.com Accept : image/jpg

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

  • /๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ๋กœ์Šค ID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช… 
  • Ex) GET : /users/{userid}/devices 

 

REST API ์„ค๊ณ„ ์˜ˆ์‹œ  

 

 

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

1XX : ์ „์†ก ํ”„๋กœํ† ์ฝœ ์ˆ˜์ค€์˜ ์ •๋ณด ๊ตํ™˜
2XX : ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰
3XX : ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ํ–‰๋™์„ ์ทจํ•ด์•ผ ํ•จ 
4XX : ํด๋ผ์ด์–ธํŠธ์˜ ์ž˜๋ชป๋œ ์š”์ฒญ
5XX : ์„œ๋ฒ„์ชฝ ์˜ค๋ฅ˜๋กœ ์ธํ•œ ์ƒํƒœ์ฝ”๋“œ

 

REFERENCE

https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

 

[Network] REST๋ž€? REST API๋ž€? RESTful์ด๋ž€? - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://www.slideshare.net/Byungwook/rest-api-60505484

 

REST API ์„ค๊ณ„

REST API์— ๋Œ€ํ•œ ๊ฐœ๋… ์ดํ•ด ๋ฐ ์„ค๊ณ„ ๋ฐฉ์‹ ๋ณด์•ˆ์— ๋Œ€ํ•œ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•

www.slideshare.net