[API] RESTful API

Lemonยท2022๋…„ 5์›” 29์ผ
2

CS

๋ชฉ๋ก ๋ณด๊ธฐ
2/17
post-thumbnail

๐Ÿ“API (Application Programming Interface)

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

"data:191031|place:seoul|which:temperature"

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

์ด๋ ‡๊ฒŒ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๋ถ€ํ„ฐ ์ง€์ •๋œ ํ˜•์‹์œผ๋กœ ์š”์ฒญ, ๋ช…๋ น์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ API๋ผ๊ณ  ํ•œ๋‹ค.


REST (REpresentational State Transfer)

์›น์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ URI๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ž์›์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก , ๋˜๋Š” ๊ทœ์น™์ด๋‹ค.


๐Ÿ“RESTful API

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

ํ•™์›์˜ ๋ฐ˜ ๋ฆฌ์ŠคํŠธ ์š”์ฒญ
http://(์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ)/1

๋ฐ˜์˜ ํ•™์ƒ๋“ค ๋ฆฌ์ŠคํŠธ ์š”์ฒญ
http://(์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ)/hello

ํ•™์ƒ์˜ ์ •๋ณด ์ˆ˜์ • ์š”์ฒญ
http://(์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ)/hyot-hong

์ด๋Ÿฐ์‹์œผ๋กœ ์งœ๋„ ์ด์— ๋งž์ถฐ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์•ฑ์„ ๋งŒ๋“ค๋ฉด ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ ์ž์ฒด์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ์„œ๋น„์Šค๋Š” ๊ฐœ๋ฐœ์ž ํ˜ผ์ž ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์ผ์„ ์ธ๊ณ„๋ฐ›๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋‚˜ ์ด API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ์ œํ’ˆ์„ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ต‰์žฅํžˆ ์ผํ•˜๊ธฐ ํž˜๋“ค์–ด ์งˆ ๊ฒƒ์ด๋‹ค.
๋•Œ๋ฌธ์— RESTful API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” ์š”์ฒญ์˜ ์ฃผ์†Œ๋งŒ์œผ๋กœ๋„ ๋Œ€๋žต ์ด๊ฒŒ ๋ญ˜ ํ•˜๋Š” ์š”์ฒญ์ธ์ง€ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์œ„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค

ํ•œํŽ˜์ด์ง€์— 10๋ช…์”ฉ ๋ฐ›์•„์˜ค๋Š” ๊ฑฐ๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์›์„ ๊ตฌ์กฐ์™€ ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚ด๋Š” ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๊ตฌ๋ถ„์ž๋ฅผ URI๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋Ÿฐ ์กฐํšŒ์ž‘์—… ๋ฟ ์•„๋‹ˆ๋ผ ์ •๋ณด๋Š” ๋„ฃ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…๋„ ํ•„์š”ํ•˜๋‹ค.
์ด๋ฅผ ํ†ตํ‹€์–ด์„œ CRUD๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

CREATE : ์ƒ์„ฑ
READ : ์กฐํšŒ
UPDATE : ์ˆ˜์ •
DELETE : ์‚ญ์ œ

์„œ๋ฒ„์— REST API๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ๋•Œ๋Š” HTTP๋ž€ ๊ทœ์•ฝ์— ๋”ฐ๋ผ ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

HyperText Transfer Protocol

REST API์˜ HTTP์˜ ๋ฉ”์†Œ๋“œ๋Š” 5๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • GET : ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ
  • POST : ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ
  • DELETE : ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šธ ๋•Œ ์‚ฌ์šฉ
  • PUT : ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ โ‡’ ํ†ต์ฑ„๋กœ ๋ณ€๊ฒฝ
  • PATCH : ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ โ‡’ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ

์ด๋“ค์„ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

GET , DELETE๋ณด๋‹ค POST, PUT, PATCH๊ฐ€ ์ •๋ณด๋Š” ๋” ๋งŽ์ด ๋น„๊ต์  ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ถฐ์„œ ์‹ค์–ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

GET , DELETE < POST, PUT, PATCH


REST ๊ทœ์น™์— ์–ด๊ธ‹๋‚˜๋Š” url

  • url์€ page ๊ธฐ์ค€์ด ์•„๋‹Œ resource ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ
[GET] http://127.0.0.1:8000/product/main_page_product
  • ๋ฉ”์ธ ํŽ˜์ด์ง€์— ํ‘œ์ถœ๋  ์ •๋ณด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํŒ๋ณ„ํ•˜์—ฌ url์„ ์ •ํ•œ๋‹ค.
  • ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ •๋ณด๋ฅผ ํ‘œ์ถœํ•œ๋‹ค๋ฉด, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘์˜ํ•˜์—ฌ REST์— ๋งž์ถฐ ๋‘๊ฐ€์ง€ ์ด์ƒ์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋™์‹œ์— ํ˜ธ์ถœ
  • ์šฐ๋ฆฌ ์›น ์„œ๋น„์Šค ๋ฉ”์ธํŽ˜์ด์ง€์— ์—ฌ๋ฆ„ํŠน๊ฐ€ + ์‚ฌ์šฉ์ž์˜ ๋‚ด ์ƒ์„ธ ์ •๋ณด
[GET] http://127.0.0.1:8000/store/find_store
  • ๋™์‚ฌ(find)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
[POST] [http://127.0.0.1:8000/product/add_first_item_information]
  • ์ž์›์„ ์ถ”๊ฐ€(add)ํ•  ๋•Œ๋Š” ~/post ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.
[GET] [http://127.0.0.1:8000/store](http://127.0.0.1:8000/store/search_store)?name='๊ฐ•๋‚จ'
  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์€ ์ž์›์˜ ์ •๋ณด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ [GET] method๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋Š” body๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ , query string์„ ํ™œ์šฉํ•œ๋‹ค.

Query Parameters (GET parameters)

์›น ํŽ˜์ด์ง€์˜ url ์ฃผ์†Œ๋ฅผ ๋ณด๋ฉด ์ข…์ข… ? ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ดค์„ ๊ฒƒ์ด๋‹ค.
? ๋’ค์—๋Š” key=value ํ˜•์‹์˜ ๋ฌธ์ž์—ด์ด ๋”ฐ๋ผ์˜จ๋‹ค. ์ด๋ฅผ Query parameter๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ฃผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํ™œ์šฉํ•œ๋‹ค.

  • filtering : ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฑด์œผ๋กœ ๊ฑฐ๋ฅด๊ธฐ
  • sorting : ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌ
  • searching : ๊ฒ€์ƒ‰
/users?id=123

ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

Path Parameters

ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

/users/123

ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.


๐Ÿค”Path Variable์™€ Query Parameter๋Š” ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋ ค๋ฉด Path Variable๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.ย ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ๋ชฉ์„ ์ •๋ ฌํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด Query Parameter๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

/users ๐Ÿ‘‰๐Ÿป ์‚ฌ์šฉ์ž ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ

/users?occupation=programer ๐Ÿ‘‰๐Ÿป ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ

/users/123 ๐Ÿ‘‰๐Ÿป ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž ๊ฐ€์ ธ์˜ค๊ธฐ

๊ธฐ๋ณธ CRUD ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ URL ๋ฐ ๊ธฐํƒ€ Query Parameter๋ฅผ ์ •์˜ํ•  ํ•„์š”์—†๋‹ค. ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์— ๋”ฐ๋ผ HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

/users [GET] ๐Ÿ‘‰๐Ÿป ์‚ฌ์šฉ์ž ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ 
/users [POST] ๐Ÿ‘‰๐Ÿป ์ƒˆ ์‚ฌ์šฉ์ž ์ƒ์„ฑ 
/users/123 [PUT] ๐Ÿ‘‰๐Ÿป ์‚ฌ์šฉ์ž ์—…๋ฐ์ดํŠธ 
/users/123 [DELETE] ๐Ÿ‘‰๐Ÿป ์‚ฌ์šฉ์ž ์ œ๊ฑฐ

์ฐธ๊ณ 
https://medium.com/@fullsour/when-should-you-use-path-variable-and-query-parameter-a346790e8a6d
https://www.youtube.com/watch?v=iOueE9AXDQQ

profile
๊ฐœ๋ฏธ๋Š” ๋š ๋š ..์˜ค๋Š˜๋„ ๋š ๋š ๐Ÿœ

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

comment-user-thumbnail
2022๋…„ 6์›” 5์ผ

์ข‹์€ ๊ธ€ ๋ณด๊ณ  ๊ฐ‘๋‹ˆ๋‹ค~

1๊ฐœ์˜ ๋‹ต๊ธ€