๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ŒCS/Web

[Web] REST & RESTful

by dar0m! 2021. 4. 3.

REST & RESTful

REST๋Š” HTTP, ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹ˆ๋‹ค! REST๋Š” ์ผ์ข…์˜ ๊ฐ€์ด๋“œ๋ผ์ธ์ด๋‹ค. 

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

REST ์›๋ฆฌ๋ฅผ ๋”ฐ๋ผ๋ฅด๋Š” ์‹œ์Šคํ…œ(์„œ๋น„์Šค)๋ฅผ RESTful ์ด๋ผ๊ณ  ํ•œ๋‹ค. = REST API ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ RESTful ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

REST

REST๋Š” Representational State Transfer์˜ ์•ฝ์ž๋กœ ๋ถ„์‚ฐ ํ•˜์ดํผ ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ ํ˜•์‹์ด๋‹ค.

์›น์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ž์›(์ด๋ฏธ์ง€, ๋™์˜์ƒ, DB์ž์›)์— ๊ณ ์œ ํ•œ URL์„ ๋ถ€์—ฌํ•ด ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž์›์„ ์ •์˜ํ•˜๊ณ  ์ž์›์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์˜๋ฏธํ•œ๋‹ค. → URL์— ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ

HTTP URI ๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ  HTTP Method๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์˜ ๋Œ€ํ•œ CRUD Operation(์ƒ์„ฑ, ์กฐํšŒ, ๋ณ€๊ฒฝ, ์‚ญ์ œ)์„ ์ ์šฉํ•œ๋‹ค.

 

HTTP URI(Uniform Resource Identifier)

URI๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์— ์กด์žฌํ•˜๋Š” ์ž์›์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์‹๋ณ„์ž์ด๋‹ค. URI์€ URL, URN๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ์œผ๋ฉฐ URL์€ Where์˜ ๊ฐœ๋…, ๋ฆฌ์†Œ์Šค์˜ ๊ตฌ์ฒด์ ์ธ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๊ณ , URN์€ What์˜ ๊ฐœ๋…, ์ด๋ฆ„์œผ๋ฃŒ ํ‘œ์‹œ๋˜๋ฉฐ ์œ ์ผํ•œ ๊ฐ’์ด๊ณ  ๋…๋ฆฝ์ ์ด๋‹ค.

URN, URL์„ ํ•ฉ์ณ ํ•˜๋‚˜์˜ ์‹๋ณ„์ž๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (์ถœ์ฒ˜)

HTTP Method

 

HTTP ์‘๋‹ต์ฝ”๋“œ ๋ฉ”์†Œ๋“œ ์ •๋ฆฌ GET, POST, PUT, PATCH, DELETE, TRACE, OPTIONS

HTTP Request ์ •๋ณด  GET /index.html HTTP/1.1  ์š”์ฒญ URL์ •๋ณด (Mehotd /URI HTTP๋ฒ„์ ผ)  user-agent: MSIE 6.0; Window NT 5.0  ์‚ฌ์šฉ์ž ์›น ๋ธŒ๋ผ์šฐ์ ธ ์ข…๋ฅ˜  accept: test/html; */*  ์š”์ฒญ ๋ฐ์ดํ„ฐ ํƒ€์ž… (์‘๋‹ต..

javaplant.tistory.com

 

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

  1. Resource : ์ž์›, HTTP URI
  2. Verb : ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„, HTTP Method
  3. Representations : ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„์˜ ๋‚ด์šฉ, HTTP Message Pay Load

 

REST ์˜ ํŠน์ง•

6๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด. ํ•ด๋‹น ํŠน์ง•์„ ์ง€์ผœ์•ผ API๊ฐ€ RESTful๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋‹ค.
  1. ํด๋ผ์ด์–ธํŠธ / ์„œ๋ฒ„ ๊ตฌ์กฐ (Client-Server)

    ์ž์›์ด ์žˆ๋Š” Server
    , ์ž์›์„ ์š”์ฒญํ•˜๋Š” Client์˜ ๊ตฌ์กฐ
  2. ๋ฌด์ƒํƒœ (Stateless)

    HTTP๋Š” Stateless ํ”„๋กœํ† ์ฝœ ์ด๋ฏ€๋กœ REST ์—ญ์‹œ ๋ฌด์ƒํƒœ์„ฑ์„ ๊ฐ€์ง„๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ Content ๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
    ๋Œ€์‹  ์„ธ์…˜์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋จ
  3. ์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ (Cacheable)

    ์›น ํ‘œ์ค€ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ , ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
    ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ฐ„์†Œํ™”ํ•จ

    โ–ทGET - ์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ cache ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    โ–ทPOST - ์ผ๋ฐ˜์ ์œผ๋กœ cache ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ. ํ•˜์ง€๋งŒ Expires์™€ Cache-Control header๋ฅผ ์ด์šฉํ•˜์—ฌ caching์„ ๊ตฌํ˜„ํ•˜์—ฌ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.
    โ–ทPUT, DELETE - ํ•ด๋‹น Request๋Š” cache๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  4. ๊ณ„์ธตํ™”

    API ์„œ๋ฒ„๋Š” ์ˆœ์ˆ˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ์•ž๋‹จ์— ์‚ฌ์šฉ์ž ์ธ์ฆ , ์•”ํ˜ธํ™” , ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๋“ฑ์„ ํ•˜๋Š” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  5. ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ(Uniform Interface)

    URI๋กœ ์ง€์ •ํ•œ ์ž์›์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผ๋˜๊ณ  ํ•œ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    HTTP ํ‘œ์ค€์—๋งŒ ๋”ฐ๋ฅธ๋‹ค๋ฉด ๋ชจ๋“  ํ”Œ๋žซํผ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  6. ์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ

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

 

REST API ์—์„œ ๋ฉฑ๋“ฑ์„ฑ์ด๋ž€?

๋ฉฑ๋“ฑ์„ฑ์ด๋ž€ ์–ด๋–ค ๋Œ€์ƒ์— ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์ ์šฉํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ์„ฑ์งˆ์ด๋‹ค.

REST API ์—์„œ ๋ฉฑ๋“ฑ์„ฑ์ด๋ž€ ์‘๋‹ต์ด ๋‹ค๋ฅผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์š”์ฒญ์ด ์˜๋„ํ•œ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•  ๋•Œ ๋ฉฑ๋“ฑ์„ฑ์ด ์œ ์ง€๋จ์„ ์˜๋ฏธํ•œ๋‹ค. (์—ฌ๋Ÿฌ๋ฒˆ ์š”์ฒญ์„ ๋ณด๋‚ด๋„ ์š”์ฒญ์— ์˜ํ•œ ์„œ๋ฒ„์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๊ฐ™์Œ)

Method ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ ์„ค๋ช…
GET O ๋‹จ์ˆœ ๋ฆฌ์†Œ์Šค ์ฝ์–ด์˜ค๋Š” ํ–‰์œ„์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜ํ–‰ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์Œ
HEAD O GET๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€
PUT(์ž์› ์ „์ฒด ๊ฐฑ์‹ ) O ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Œ, ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์ˆ˜์ •๋œ๋‹ค.
์š”์ฒญ์— ๋‹ด๊ธด ๋ฆฌ์†Œ์Šค๋กœ ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ฒดํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜ํ–‰ํ•ด๋„ ์š”์ฒญ์— ๋‹ด๊ธด ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” ๋™์ผ
DELETE O ์ด๋ฏธ ์กด์žฌํ•˜๋“ , ์กด์žฌํ•˜์ง€ ์•Š๋“  ๊ทธ ๋ฐ์ดํ„ฐ๋Š” DELETE ์š”์ฒญ์„ ๋ณด๋‚ธ ์‹œ์ ์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•œ ์‚ฌํ•ญ์€ ์ด๋ฃจ์–ด ์กŒ์Œ
POST X ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ํ–‰์œ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์ด๊ณ , ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋งค๋ฒˆ ๋‹ฌ๋ผ์ง„๋‹ค.
PATCH(์ž์›์˜ ์ผ๋ถ€ ๊ต์ฒด) โ–ณ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ PUT ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ๋ณด์žฅ๋  ์ˆ˜๋„ ์žˆ๊ณ , ๋ณด์žฅ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. PUT ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ํ–‰์œ„๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ œํ•œ์ด ๋”ฑํžˆ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

1. ์ˆ˜์ •ํ•  ๋ฆฌ์†Œ์Šค์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋‹ด์—์„œ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹น์—ฐํžˆ ๋ฉฑ๋“ฑ์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.
2. ํ•˜์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ $increaseํ•„๋“œ ๊ฐ’์€ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์‹ถ์€ ์†์„ฑ์„ ์˜๋ฏธํ•˜๊ณ , value ํ•„๋“œ ๊ฐ’์€ ๊ทธ ์†์„ฑ์„ ์–ผ๋งˆ๋‚˜ ์ฆ๊ฐ€์‹œํ‚ฌ ๊ฒƒ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ๊ฒฝ์šฐ API๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋‚˜์ด๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด API๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

PATCH users/1 {
  $increase: 'age',
  value: 1,
}

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

์•ˆ์ „ํ•œ ๋ฉ”์†Œ๋“œ : GET, HEAD์™€ ๊ฐ™์ด ์„œ๋ฒ„์ธก์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ
๋ฉฑ๋“ฑํ•œ ๋ฉ”์†Œ๋“œ : ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ณ , ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹ค๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•œ ์‚ฌํ•ญ์€ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜, ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์„œ๋ฒ„์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๊ฐ™๋‹ค.

 

REST ์žฅ๋‹จ์ 

์žฅ์ 

  1. ์‰ฌ์šด ์‚ฌ์šฉ

    HTTP ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ณ„๋„์˜ ์ธํ”„๋ผ ๊ตฌ์ถ•์ด ํ•„์š” ์—†๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์—ญํ• ์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ

    ํด๋ผ์ด์–ธํŠธ์˜ Context๋ฅผ ์œ ์ง€ํ•  ํ•„์š” ์—†์Œ
  3. ํŠน์ • ๋ฐ์ดํ„ฐ ํ‘œํ˜„์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    ํ—ค๋” ๋ถ€๋ถ„์— URI ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ช…์‹œํ•˜๊ณ  ํ•„์š”ํ•œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ body์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„๋ฆฌ์‹œํ‚ด. JSON, XML ๋“ฑ ์›ํ•˜๋Š” Representation ์–ธ์–ด๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋‹จ์ 

  1. ๋ฉ”์†Œ๋“œ ํ•œ๊ณ„

    HTTP Method๋กœ URI๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ์ง€๋งŒ ํ˜•ํƒœ๊ฐ€ ์ œํ•œ์ ์ž„
  2. ํ‘œ์ค€์ด ์—†์Œ

    REST๋Š” ์„ค๊ณ„ ๊ฐ€์ด๋“œ์ผ ๋ฟ ๋ช…ํ™•ํ•œ ํ‘œ์ค€์ด ์—†๋‹ค.

 

์ฐธ๊ณ 

'๐Ÿ“ŒCS > Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

XSS(Cross-site Scripting) ๊ณต๊ฒฉ  (0) 2021.04.25
[Web] param vs query vs body  (2) 2021.04.18
[Web] CORS(Cross-Origin Resource Sharing)  (0) 2021.04.18
[Web] HTTP, HTTPS, HTTP ๋ฒ„์ „  (1) 2021.04.08
[Web] ์ฟ ํ‚ค์™€ ์„ธ์…˜  (0) 2021.04.04

๋Œ“๊ธ€