RESTful API

RESTful API

๐Ÿ’ก REST ํŠน์ง•์„ ์ง€ํ‚ค๋ฉด์„œ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์˜๋ฏธ !


REST(Representational State Transfer) ๋ž€?</br> ์›น์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ž์›(ex ์ด๋ฏธ์ง€,๋™์˜์ƒ ๋ฐ์ดํ„ฐ)์— ๊ณ ์œ ํ•œ URI๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ž์›์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  ๋˜๋Š” ๊ทœ์น™์œผ๋กœ ์˜ค๋Š˜๋‚  ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

1. ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ ์ง€์‹

  • URI(Uniform Resource Identifier)
    • ํ•ด๋‹น ์‚ฌ์ดํŠธ์˜ ํŠน์ • ์ž์›์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์œ ์ผํ•œ ์ฃผ์†Œ
    • /login, /news ๋“ฑ
  • HTTP Method
    • HTTP request๊ฐ€ ์˜๋„ํ•˜๋Š” action์„ ์ •์˜ํ•œ ๊ฒƒ
    • GET,POST ๋“ฑ
  • Payload
    • HTTP request์—์„œ server๋กœ ๋ณด๋‚ด์ง€๋Š” ๋ฐ์ดํ„ฐ (body)

2. Representational State Transfer๋ž€?

  • ์›น์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ HTTP URI๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ทธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ–‰์œ„๋ฅผ HTTP Method๋กœ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹
    โžก๏ธ ๋ฆฌ์†Œ์Šค(HTTP URI๋กœ ์ •์˜๋œ)๋ฅผ ์–ด๋–ป๊ฒŒ ํ•œ๋‹ค(HTTP Method + Payload)๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ํ‘œํ˜„

3. REST์˜ ํŠน์ง•

  1. Uniform(์œ ๋‹ˆํผ ์ธํ„ฐํŽ˜์ด์Šค)
  • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผ๋˜๊ณ  ํ•œ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ์ด๋‹ค.
  1. Stateless(๋ฌด์ƒํƒœ์„ฑ)
  • ์ž‘์—…์„ ์œ„ํ•œ ์ƒ์ฑ„์ •๋ณด๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€์•Š๋Š”๋‹ค. ์„ธ์…˜ ์ •๋ณด๋‚˜ ์ฟ ํ‚ค์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— API ์„œ๋ฒ„๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ์„ ๋‹จ์ˆœํžˆ ์ฒ˜๋ฆฌ๋งŒ ํ•ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ์‰ฝ๊ณ  ๋‹จ์ˆœํ•ด์ง„๋‹ค.
  1. ์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ(Cacheable)
  • HTTP๋ผ๋Š” ๊ธฐ์กด ์›นํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ธํ”„๋ผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  1. Self-doescriptiveness(์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ)
  • REST API ๋ฉ”์„ธ์ง€๋งŒ ๋ณด๊ณ ๋„ ๊ทธ ์š”์ฒญ์ด ์–ด๋–ค ํ–‰์œ„๋ฅผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  1. Client - Server ๊ตฌ์กฐ
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์œ ์ €์™€ ๊ด€๋ จ๋œ ์ฒ˜๋ฆฌ, ์„œ๋ฒ„๋Š” REST API๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ํ™•์‹คํžˆ ๊ตฌ๋ถ„๋˜๊ณ , ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ๋‚ด์šฉ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ , ์„œ๋กœ๊ฐ„์˜ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ ๋‹ค.
  1. ๊ณ„์ธตํ™”(Layered System)
  • ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณด์•ˆ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•ด ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋ก์‹œ, ๊ฒŒ์ดํŠธ์›จ์ด ๋“ฑ์˜ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  • URI ์ •๋ณด๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค
  • ๋ฆฌ์†Œ์Šค๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ex) GET/user/1 โ†’ GET/users/1

  • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ–‰์œ„๋ฅผ HTTP Method(GET,POST,PUT,DELETE)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
    • URI์— HTTP Method๊ฐ€ ํฌํ•จ๋˜์„œ๋Š” ์•ˆ๋œ๋‹ค. ex) GET delete/user/1 โ†’ DELETE /users/1
    • ๋™์‚ฌ๊ฐ€ ํ‘œํ•จ๋˜์„œ๋Š” ์•ˆ๋œ๋‹ค. ex) GET /user/show/1 โ†’ GET /users/1
  • ๋ฆฌ์†Œ์Šค ์‚ฌ์ด์— ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    • /๋ฆฌ์†Œ์Šค/๊ณ ์œ ID/๊ด€๊ณ„ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค ex) GET /users/{user_id}/profile
  • URI๋Š” / ๊ตฌ๋ถ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์›์˜ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

    • ex) GET users/portfolios
  • URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ /๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ URI๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ -์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.
  • _๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • URI ๊ฒฝ๋กœ์—๋Š” ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ์„ ํ”ผํ•˜๋„๋ก ๊ทœ์ •ํ•˜๊ณ  ์žˆ๋‹ค.
  • ํŒŒ์ผ์˜ ๊ฒฝ์šฐ payload์˜ ํฌ๋งท์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ URI์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

RESTful ํ•˜์ง€ ๋ชปํ•œ API ์„ค๊ณ„ ์˜ˆ์‹œ

<๋‚˜์œ ์˜ˆ์‹œ>                        <์ข‹์€ ์˜ˆ์‹œ>

http://ํ˜ธ์ŠคํŠธ/detail_page     => http://ํ˜ธ์ŠคํŠธ/product
http://ํ˜ธ์ŠคํŠธ/main_page       => http://ํ˜ธ์ŠคํŠธ/products
http://ํ˜ธ์ŠคํŠธ/find/product    => http://ํ˜ธ์ŠคํŠธ/product
http://ํ˜ธ์ŠคํŠธ/add/product     => http://ํ˜ธ์ŠคํŠธ/product
http://ํ˜ธ์ŠคํŠธ/product_reviews => http://ํ˜ธ์ŠคํŠธ/product/1/reviews
http://ํ˜ธ์ŠคํŠธ/product_filter  => http://ํ˜ธ์ŠคํŠธ/product?name="abc"