REST API๋ž€?

cdwdeยท2021๋…„ 6์›” 10์ผ
0

๐ŸŽˆ REST์˜ ๊ฐœ๋…

REST์˜ ์ •์˜

  • Representtational State Transfer

  • ์ž์›์˜ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ
    (= ์ž์›์˜ ํ‘œํ˜„์— ์˜ํ•œ ์ƒํƒœ ์ „๋‹ฌ)

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

  • HTTP URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ  HTTP Method๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ

โ— URI vs URL
URI๋Š” URL์„ ํฌํ•จ

  • URI (Uniform Resource Identifier)

    • ์ธํ„ฐ๋„ท ์ƒ์˜ ์ž์›์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด์˜ ๊ตฌ์„ฑ
  • URL (Uniform Resource Locator)
    - ์ธํ„ฐ๋„ท ์ƒ ์ž์›์˜ ์œ„์น˜
    - ์–ด๋–ค ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธ

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

์žฅ์ 

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ REST API ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ธํ”„๋ผ ๊ตฌ์ถ• ํ•„์š” ์—†์Œ

  • HTTP ํ”„๋กœํ† ์ฝœ ํ‘œ์ค€์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ถ”๊ฐ€์ ์ธ ์žฅ์ ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Œ

  • HTTP ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ

  • REST API ๋ฉ”์„ธ์ง€๊ฐ€ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ

  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ

๋‹จ์ 

  • ํ‘œ์ค€ ์กด์žฌ X

  • HTTP Method ํ˜•ํƒœ๊ฐ€ ์ œํ•œ์ 

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

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

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

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

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

    • ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ ID๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด ์ž์›์€ server์— ์กด์žฌ

    • ์ž์›์„ ๊ตฌ๋ณ„ํ•˜๋Š” ID๋Š” HTTP URI

    • Client๋Š” URI๋ฅผ ์ด์šฉํ•ด์„œ ์ž์›์„ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์กฐ์ž‘์„ server์— ์š”์ฒญ

  2. ํ–‰์œ„: HTTP Method

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

    • HTTP ํ”„๋กœํ† ์ฝœ์€ GET, POST, PUT, DELETE์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ œ๊ณต

  3. ํ‘œํ˜„

    • Client๊ฐ€ ์ž์›์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ์š”์ฒญํ•˜๋ฉด Server๋Š” ์ด์— ์ ์ ˆํ•œ ์‘๋‹ต ๋ณด๋ƒ„

    • Rest์—์„œ ํ•˜๋‚˜์˜ ์ž์›์€ JSON, XML.. ๋“ฑ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ Representation์œผ๋กœ ๋‚˜ํƒ€๋ƒ„


REST ํŠน์ง•

  1. server-client

    • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ์ž์„ธํ•œ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†์ด ์ œ๊ณต๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜์—ฌ ์‘๋‹ต์„ ๋ฐ›์Œ, ์ž์‹ ์˜ Context ๊ด€๋ฆฌ

    • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ดํŠธ์˜ ์ƒํƒœ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์ œ๊ณตํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋งŒ ๋‹ด๋‹นํ•˜์—ฌ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๊ทธ์— ๋งž๋Š” ์‘๋‹ต ์ œ๊ณต

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

    • ๊ฐ๊ฐ์˜ ์š”์ฒญ ์‹œ ํด๋ผ์ด์–ธํŠธ์˜ Context๊ฐ€ ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š์Œ

    • ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ API ์„œ๋ฒ„๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์˜ ๋ฉ”์‹œ์ง€๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋˜๊ณ  ์„ธ์…˜๊ณผ ๊ฐ™์€ Context ์ •๋ณด๋ฅผ ์‹ ๊ฒฝ ์“ธํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด์ง

    • ์„œ๋ฒ„๋Š” ๊ฐ๊ฐ์˜ ์š”์ฒญ์„ ๋ณ„๊ฐœ์˜ ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฉฐ ์ด์ „ ์š”์ฒญ์ด ๋‹ค์Œ ์š”์ฒญ์— ์—ฐ๊ด€๋˜์–ด์„œ๋Š” ์•ˆ๋จ

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

    • ์›น ํ‘œ์ค€ HTTP ํ”„๋กœํ† ์ฝœ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ -> ์บ์‹ฑ ๊ธฐ๋Šฅ ์ ์šฉ ๊ฐ€๋Šฅ

    • ๊ตฌํ˜„์€ HTTP ํ”„๋กœํ† ์ฝœ ํ‘œ์ค€์—์„œ ์‚ฌ์šฉํ•˜๋Š” Last-Modified ํƒœ๊ทธ๋‚˜ E-Tag๋ฅผ ์ด์šฉํ•˜๋ฉด ์บ์‹ฑ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

    • ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋„คํŠธ์›Œํฌ ์‘๋‹ต ์‹œ๊ฐ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ REST ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์œ„์น˜ํ•œ ์„œ๋ฒ„์— ํŠธ๋žœ์žญ์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์‘๋‹ต์‹œ๊ฐ„๊ณผ ์„ฑ๋Šฅ, ์„œ๋ฒ„์˜ ์ž์› ์‚ฌ์šฉ๋ฅ ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

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

    • REST Server๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณด์•ˆ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™” ๋“ฑ์„ ์œ„ํ•œ ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

    • Proxy, Gateway์™€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

  5. Code-On-Demand

    • ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ‘œํ˜„์„ ์‘๋‹ต์œผ๋กœ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ code๋ฅผ ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  1. Uniform Interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)

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

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ”Œ๋žซํผ์— ๋ฌด๊ด€ํ•˜๋ฉฐ ํŠน์ • ์–ธ์–ด๋‚˜ ๊ธฐ์ˆ ์— ์ข…์†๋ฐ›์ง€ ์•Š์Œ

    • REST API๋Š” HTTP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์š”์ฒญ ๊ฐ€๋Šฅ, Loosely Coupling(๋Š์Šจํ•œ ๊ฒฐํ•จ) ํ˜•ํƒœ๋ฅผ ๊ฐ–๊ฒŒ๋จ

  2. Self-Description(์ž์ฒด ํ‘œํ˜„)

    • REST Api๋Š” ์š”์ฒญ ๋ฉ”์„ธ์ง€๋งŒ ๋ณด๊ณ ๋„ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ

๐ŸŽˆ REST API ๊ฐœ๋…

API

Application Programming Interface

REST API ์ •์˜

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

REST API ํŠน์ง•

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

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


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

  • ๋„ํ๋จผํŠธ: ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ฝ”๋“œ์™€ ์œ ์‚ฌ
  • ์ปฌ๋ ‰์…˜: ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ผ๋Š” ๋ฆฌ์†Œ์Šค
  • ์Šคํ† ์–ด: ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ €์žฅ์†Œ

  • ๋„ํ๋จผํŠธ vs ์ปฌ๋ ‰์…˜
    ๋„ํ๋จผํŠธ๋Š” ๊ฐ์ฒด ํ•˜๋‚˜, ์ปฌ๋ ‰์…˜์€ ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ
    - /users/1/products/3์—์„œ users, products ์ปฌ๋ ‰์…˜๊ณผ 1(id๊ฐ€ 1๋ฒˆ์ธ user), 3(id๊ฐ€ 3๋ฒˆ์ธ products)์„ ์˜๋ฏธํ•˜๋Š” ๋„ํ๋จผํŠธ๋กœ ๊ตฌ์„ฑ
  1. URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผํ•œ๋‹ค

    • resource๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ, ๋Œ€๋ฌธ์ž๋ณด๋‹ค ์†Œ๋ฌธ์ž ์‚ฌ์šฉ
    • resource์˜ ๋„ํ๋จผํŠธ ์ด๋ฆ„์œผ๋กœ๋Š” ๋‹จ์ˆ˜ ๋ช…์‚ฌ ์‚ฌ์šฉ
    • resource์˜ ์ปฌ๋ ‰์…˜ ์ด๋ฆ„์œผ๋กœ๋Š” ๋ณต์ˆ˜ ๋ช…์‚ฌ ์‚ฌ์šฉ
    • resource์˜ ์Šคํ† ์–ด ์ด๋ฆ„์œผ๋กœ๋Š” ๋ณต์ˆ˜๋ช…์‚ฌ ์‚ฌ์šฉ
  2. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method๋กœ ํ‘œํ˜„

    • URI์— HTTP Method๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋จ
    • URI์— ํ–‰์œ„์— ๋Œ€ํ•œ ๋™์‚ฌ ํ‘œํ˜„์ด ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋จ
    • ๊ฒฝ๋กœ ๋ถ€๋ถ„ ์ค‘ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์€ ์œ ์ผํ•œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด

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

  1. /๋Š” ๊ณ„์ธต๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉ

  2. URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ๋Š” /๋ฅผ ์‚ฌ์šฉ X

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

  4. _์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

  5. URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž ์ ํ•ฉ

  6. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จ X

  7. ๋ฆฌ์†Œ์Šค ๊ฐ„ ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ์†Œ์ŠคID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช…
    (์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ์œ  'has'์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ)


๐ŸŽˆ HTTP ์ƒํƒœ ์ฝ”๋“œ

MDN HTTP ์ƒํƒœ ์ฝ”๋“œ

์ƒํƒœ์ฝ”๋“œ
200 OKํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•จ
201 Createdํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์„ ์š”์ฒญ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋จ
400
Bad Request
์ž˜๋ชป๋œ ๋ฌธ๋ฒ•์œผ๋กœ ์ธํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Œ
401 Unauthorizedํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต์ฝ”๋“œ
403 Forbidden์ฝ˜ํ…์ธ ์— ์ ‘๊ทผํ•  ๊ถŒ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ
(401๊ณผ ๋‹ค๋ฅด ์ ์€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ๊ณ  ์žˆ์Œ)
404 Not Found์„œ๋ฒ„๊ฐ€ ์š”์ฒญ๋ฐ›์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ
500์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ

์ฐธ๊ณ 
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://ijbgo.tistory.com/20
https://mangkyu.tistory.com/46
https://velog.io/@kjh107704/REST-%EC%84%9C%EB%B2%84-REST-API%EB%9E%80

0๊ฐœ์˜ ๋Œ“๊ธ€