SU_DING_GI

RESTful API ๋ณธ๋ฌธ

BACK-END

RESTful API

Soonga00 2024. 3. 27. 11:30
728x90

API

๐Ÿ’ก API๋ž€ Application Programming Interface์˜ ์•ฝ์ž๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค

  • API๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ํ†ต๋กœ ํ˜น์€ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋„ API์ด๋‹ค.

 

REST API

๐Ÿ’ก REST๋Š” REpresentational State Transfer๋ผ๋Š” ์šฉ์–ด์˜ ์•ฝ์ž๋กœ HTTP method๋ณ„๋กœ ์—ญํ•  ๋ช…์‹œํ•œ API

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

  1. URL์€ ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    1. ์ •๋ณด์˜ ์ž์› ์ด๋ฆ„์€ ๋™์‚ฌ๋ณด๋‹ค ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    2. /members/1
  2. ์ž์›์˜ ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method(GET, POST, PUT, DELETE ๋“ฑ)๋กœ ํ‘œํ˜„
  3. GET /members/1

URL ์„ค๊ณ„ ์‹œ ์ฃผ์˜ํ•  ์ 

  1. ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž(/)๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
  2. URL ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ํ•˜์ดํ”ˆ(-)์€ URL ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
    1. ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๊ธด URL ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  4. ๋ฐ‘์ค„(_)์€ URL์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    1. ๋ฐ‘์ค„์€ ๋ณด๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋ฐ‘์ค„ ๋•Œ๋ฌธ์— ๋ฌธ์ž๊ฐ€ ๊ฐ€๋ ค์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ‘์ค„๋ณด๋‹ค๋Š” ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
  5. URL๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.
    1. RFC 3986(URL ๋ฌธ๋ฒ• ํ˜•์‹)์€ URL ์Šคํ‚ค๋งˆ์™€ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜๋„๋ก ๊ทœ์ •
  6. ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URL์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
    1. Accept header๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋ช…์‹œ
    2. GET /members/soccer/245/photo HTTP/1.1 Host: restapi.example.com Accept: imgae/jpg

์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” Collection๊ณผ Document

๐Ÿ’ก Document : ๋ฌธ์„œ ํ˜น์€ ๊ฐ์ฒด (๋‹จ์ˆ˜๋กœ ํ‘œํ˜„)
     Collection : ๋ฌธ์„œ๋“ค์˜ ์ง‘ํ•ฉ ํ˜น์€ ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ (๋ณต์ˆ˜๋กœ ํ‘œํ˜„)

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

  • 200 : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰
  • 201 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์„ ์š”์ฒญ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋จ (POST๋ฅผ ํ†ตํ•œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์ž‘์—… ์‹œ)
  • 400 : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋ถ€์ ์ ˆ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
  • 401 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
    • ex) ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์€ ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ ํ–ˆ์„ ๋•Œ, ์š”์ฒญ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋Œ€
  • 403 : ์œ ์ € ์ธ์ฆ ์ƒํƒœ์™€ ๊ด€๊ณ„ ์—†์ด ์‘๋‹ตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
    • 403 ๋ณด๋‹ค๋Š” 400์ด๋‚˜ 404๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ๊ณ . 403 ์ž์ฒด๊ฐ€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ ๋‚ดํฌ
  • 405 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ–ˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
  • 301 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ URL์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ
    • ์‘๋‹ต ์‹œ Location header์— ๋ณ€๊ฒฝ๋œ URL์„ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค
  • 500 : ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ

 

CRUD vs REST

CRUD

https://www.notion.so/icons/database_green.svg
CRUD๋Š” CREATE, READ, UPDATE, DELETE์˜ ์•ฝ์ž๋กœ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰๋˜๋Š” ๋„ค ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์•ฝ์–ด

REST

https://www.notion.so/icons/globe_blue.svg

REST๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ HTTP ํ”„๋กœํ† ์ฝœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์›น API์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ์Šคํƒ€์ผ ์ค‘ ํ•˜๋‚˜

REST์™€ CRUD์˜ ์œ ์‚ฌ์ 

  REST CRUD  
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ POST CREATE insert ๋ฌธ์„ ํ†ตํ•ด ์ƒˆ ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜จ ์ •๋ณด๋ฅผ ์ฝ๊ธฐ GET READ/RETRIEVE ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
๊ฐœ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธ PUT/PATCH UPDATE ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ์—…๋ฐ์ดํŠธ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ ˆ์ฝ”๋“œ ์ œ๊ฑฐ DELETE DELETE ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ

REST์™€ CRUD์˜ ์ฐจ์ด์ 

  • CRUD๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •์—์„œ ์˜๊ตฌ์ ์ธ ๊ธฐ๋ก์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ๊ธฐ์ด๊ณ , RESTful ์•„ํ‚คํ…์ฒ˜์˜ ๋ชฉํ‘œ๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด REST ๋ช…๋ น์— ๋งคํ•‘ ๋œ๋‹ค
  • ์ฆ‰ REST api๋Š” ํ‘œ์ค€์ด๊ณ , CRUD๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

์ถœ์ฒ˜

[04] CRUD vs REST ๋ฌด์Šจ ์˜๋ฏธ์ธ๊ฐ€?

๊ฐœ๋ฐœ ์ดˆ๋ณด๋ฅผ ์œ„ํ•œ RESTful API ์„ค๊ณ„ ๊ฐ€์ด๋“œ