REST API

REST

REST(Representational State Transfer)์˜ ์•ฝ์ž๋กœ ์ž์›์„ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  1. HTTP URI(Uniform Resource Identifier)์„ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ 
  2. HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด
  3. ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•œ๋‹ค.

CRUD Operation

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

๋ฉฑ๋“ฑ์„ฑ

๋ฉฑ๋“ฑ์„ฑ(idempotent)์ด๋ž€ ์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜ํ–‰ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ํ˜ธ์ถœ๋กœ ์ธํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ˜•์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. HTTP Method ์ค‘์— POST๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ๋ฉฑ๋“ฑ์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

GET๋ฐฉ์‹์ด POST๋ฐฉ์‹๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค?

GET ๋ฐฉ์‹์€ ์บ์‹ฑ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ฒˆ ์š”์ฒญ์‹œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ฏ€๋กœ ์กฐ๊ธˆ ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.


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

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

REST ํŠน์ง•

  1. Server-Client(์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ)
  2. Stateless(๋ฌด์ƒํƒœ)
  3. Cacheable(์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)
  4. Layered System(๊ณ„์ธตํ™”)
  5. Uniform Interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)
  6. Code-On-Demand(optional) - Server๋กœ๋ถ€ํ„ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ›์•„์„œ Client์—์„œ ์‹คํ–‰ํ•œ๋‹ค.(์„ ํƒ์‚ฌํ•ญ)

REST ์žฅ์ 

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

REST ๋‹จ์ 

  1. ํ‘œ์ค€์ด ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  2. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ 4๊ฐ€์ง€๋ฐ–์— ์—†๋‹ค.
  3. HTTP Method ํ˜•ํƒœ๊ฐ€ ์ œํ•œ์ ์ด๋‹ค.
  4. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•  ์ผ์ด ๋งŽ์€ ์„œ๋น„์Šค๋ผ๋ฉด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” URL๋ณด๋‹ค Header ์ •๋ณด์˜ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „๋ฌธ์„ฑ์ด ์š”๊ตฌ๋œ๋‹ค.
  5. ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š์•„ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค.
    • PUT, DELETE๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • pushState๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

REST API

REST API๋Š” REST์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” API๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

API(Application Programming Interface)

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, ์šด์˜ ์ฒด์ œ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ๊ณผ ์†Œํ†ตํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋งค๊ฐœ์ฒด. ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

REST API ๋””์ž์ธ ๊ฐ€์ด๋“œ

  1. ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
    • RFC3986์€ ์ฒด๊ณ„ ๋ฐ ํ˜ธ์ŠคํŠธ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  URI๋ฅผ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ •์˜ํ•œ๋‹ค.
  2. ์Šค๋„ค์ดํฌ์ผ€์ด์Šค(snake_case)๋Œ€์‹  ์ผ€๋ฐฅ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์Šค๋„ค์ดํฌ์ผ€์ด์Šค๋Š” ๋ณด๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋ฌธ์ž๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ๋„ ํ•˜๋ฏ€๋กœ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ฐ‘์ค„์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. Path Variable์—๋Š” ์นด๋ฉœ์ผ€์ด์Šค(camelCase)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • [GET] /users/{userId}
  4. JSON property์—๋Š” ์นด๋ฉœ์ผ€์ด์Šค(camelCase)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    1
    2
    3
    4
    
     {
         userId: '1',
         userName: 'Youngjae'
     }
    
  5. URI์˜ ๋งˆ์ง€๋ง‰์—๋Š” ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ถ„๋ช…ํ•œ URI๋ฅผ ๋งŒ๋“ค์–ด ํ†ต์‹ ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™์„ ์ฃผ์ง€ ์•Š๋„๋ก URI ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰์—๋Š” ์Šฌ๋ž˜์‹œ(/)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  6. ๊ณ„์ธต๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ๋Š” ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
    • ์Šฌ๋ž˜์‹œ ๋ฌธ์ž๋Š” URI์˜ ๊ฒฝ๋กœ ๋ถ€๋ถ„์—์„œ ์ž์› ๊ฐ„์˜ ๊ณ„์ธต์  ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
    • ํ–‰์œ„(Verb)๋Š” ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ–‰์œ„(Verb)๋Š” URL๋Œ€์‹  Method๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค.
  7. ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URI์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
    • Content-Type ์ด๋ผ๋Š” ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š”๋Œ€๋กœ ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ body์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•œ๋‹ค.
    • HTTP์—์„œ ์ œ๊ณตํ•˜๋Š” ํ˜•์‹ ์„ ํƒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ Aceept ์š”์ฒญ ํ—ค๋”๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ด์•ผ ํ•œ๋‹ค.
  8. ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ž์›์˜ ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋˜, ์ปจํŠธ๋กค ์ž์›์„ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ์ ์œผ๋กœ ๋™์‚ฌ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.
  9. Collection์—๋Š” ๋‹จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ณต์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  10. API ๋ฒ„์ „์„ ์œ„ํ•ด์„œ ์„œ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • https://example.com/v1/โ€ฆ
  11. list ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ์šฐ ๊ฐฏ์ˆ˜๋„ ํ•จ๊ป˜ ์‘๋‹ตํ•œ๋‹ค.
  12. list ์‘๋‹ต์˜ ๊ฒฝ์šฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ limit๊ณผ offset ์ •๋ณด๋ฅผ ๋ฐ›๋Š”๋‹ค.
  13. ์ƒํƒœ๊ฐ’์„ ์‘๋‹ตํ•œ๋‹ค.(์ƒํƒœ์ฝ”๋“œ ์ฐธ๊ณ )
    • Informational 1XX: ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‘๋‹ต
    • Successful 2XX : ์„ฑ๊ณต์ ์ธ ์‘๋‹ต
      • 200 OK: ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰
    • Redirection 3XX
      • ๋ฉ”์‹œ์ง€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ถ”๊ฐ€์ ์ธ ํ–‰๋™์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • Client Error 4XX
      • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์ž˜๋ชป๋œ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒฝ์šฐ
      • 401 Unauthorized: ์ธ์ฆ์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ ๊ฒฝ์šฐ
      • 403 Forbiden: ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ
      • 406 Not Acceptable: ํ—ˆ์šฉ ๋ถˆ๊ฐ€๋Šฅ
    • Server Error 5XX
      • ์„œ๋ฒ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ •์ƒ์ ์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
      • 500 Internal Server Error: ์›น ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Œ
      • 503 Service Unavailable: ์„œ๋น„์Šค ์ œ๊ณต๋ถˆ๊ฐ€, ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜, ์„œ๋ฒ„ ํญ์ฃผ

RESTful API

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

Categories:

Updated:

Leave a comment