RESTful API

GreenBeanยท2021๋…„ 5์›” 15์ผ
0
post-thumbnail

RESTful API

When Should You Use Path Variable and Query Parameter?

์›น์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋””(End-point)์— ์š”์ฒญํ•  ๊ฒƒ์ธ๊ฐ€๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ!

REST (REpresentational State Transfer) : ์›น์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ž์›(resorce)์— ๊ณ ์œ ํ•œ URI๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ž์›์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก , ๋˜๋Š” ๊ทœ์น™. ํ˜„์žฌ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ

โœ“ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ ์ง€์‹

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

โœ“ Query parameters (GET parameters)

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

์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฑด์œผ๋กœ ๊ฑฐ๋ฅด๊ฑฐ๋‚˜(filtering), ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌํ•˜๊ฑฐ๋‚˜(sorting), ๊ฒ€์ƒ‰(searching)ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ™œ์šฉ

/users?id=123 # Fetch a user who has id of 123
  • ? ๋’ค์— id๋ž€ ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋‹ด์•„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด Query string
    • users์— ๋‹ด๊ธด ์ •๋ณด ์ค‘ id 123๋ฒˆ์˜ ์ž๋ฃŒ๋ฅผ ๋‹ฌ๋ผ๋Š” ์š”์ฒญ

โœ“ Path parameters

/users/123 # Fetch a user who has id 123
  • ๋™์ผํ•œ ์š”์ฒญ์„ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์ด Path Variable

โœ“ Query string๊ณผ Path variable์€ ๊ฐ๊ฐ ์–ธ์ œ ์“ฐ๋ฉด ์ข‹์€๊ฐ€?

์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์ž์›(๋ฐ์ดํ„ฐ)์˜ ์œ„์น˜๋ฅผ ํŠน์ •ํ•ด์„œ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๊ฒฝ์šฐ Path variable๋ฅผ ์ ์šฉํ•˜๊ณ , ์ •๋ ฌํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐํ•ด์„œ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๊ฒฝ์šฐ์— Query parameter๋ฅผ ์ ์šฉ

/users # Fetch a list of users
/users?occupation=programer # Fetch a list of programer user
/users/123 # Fetch a user who has id 123
  • ์œ„์˜ ๋ฐฉ์‹์œผ๋กœ ์–ด๋””์— ์–ด๋–ค ๋ฐ์ดํ„ฐ(๋ช…์‚ฌ)๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ ๊ฐ€๋Šฅ
  • ํ•˜์ง€๋งŒ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ญ˜ ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๋™์‚ฌ๋Š” ๋น ์ ธ์žˆ๋Š”๋ฐ, ๋™์‚ฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด GET, POST, PUT, DELETE ๋ฉ”์†Œ๋“œ
  • ์ฆ‰, Query string๊ณผ Path variable์ด ์ด๋“ค ๋ฉ”์†Œ๋“œ์™€ ๊ฒฐํ•ฉํ•จ์œผ๋กœ์จ "ํŠน์ • ๋ฐ์ดํ„ฐ"์— ๋Œ€ํ•œ CRUD ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”๊ฐ€์˜ ์—”๋“œํฌ์ธํŠธ ์—†์ด ์™„๊ฒฐ ์ง€์šธ ์ˆ˜ ์žˆ๊ฒŒ ๋จ
    • ์˜ˆ์‹œ ) users/create ํ˜น์€ users?action=create๋ฅผ ๊ตณ์ด ๋ช…์‹œํ•ด ์ค„ ํ•„์š”๊ฐ€ ์—†์Œ
/users [GET] # Fetch a list of users
/users [POST] # Create new user
/users/123 [PUT] # Update user
/users/123 [DELETE] # remove user

Tip! ์ถ”๊ฐ€ ๋‚ด์šฉ

RESTful์ด๋ž€?

  • RESTful์€ ์ผ๋ฐ˜์ ์œผ๋กœ REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด
    • โ€˜REST APIโ€™๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ โ€˜RESTfulโ€™ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ
  • RESTful์€ REST๋ฅผ REST๋‹ต๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œํ•œ ๊ฒƒ์ด ์•„๋‹˜
    • ์ฆ‰, REST ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์€ RESTful์ด๋ž€ ์šฉ์–ด๋กœ ์ง€์นญ๋œ๋‹ค.

RESTful์˜ ๋ชฉ์ 

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

REST์˜ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…

  • HTTP URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ์ž์›(Resource)์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

REST์˜ ์ •์˜

  • โ€œRepresentational State Transferโ€ ์˜ ์•ฝ์ž
  • ์ž์›์„ ์ด๋ฆ„(์ž์›์˜ ํ‘œํ˜„)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธ
  • ์ฆ‰, ์ž์›(resource)์˜ ํ‘œํ˜„(representation) ์— ์˜ํ•œ ์ƒํƒœ ์ „๋‹ฌ
    • a. ์ž์›(resource)์˜ ํ‘œํ˜„(representation)
      • ์ž์›: ํ•ด๋‹น ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ (Ex. ๋ฌธ์„œ, ๊ทธ๋ฆผ, ๋ฐ์ดํ„ฐ, ํ•ด๋‹น ์†Œํ”„ํŠธ์›จ์–ด ์ž์ฒด ๋“ฑ)
      • ์ž์›์˜ ํ‘œํ˜„: ๊ทธ ์ž์›์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฆ„ (Ex. DB์˜ ํ•™์ƒ ์ •๋ณด๊ฐ€ ์ž์›์ผ ๋•Œ, โ€˜studentsโ€™๋ฅผ ์ž์›์˜ ํ‘œํ˜„์œผ๋กœ ์ •ํ•จ)
    • b. ์ƒํƒœ(์ •๋ณด) ์ „๋‹ฌ
      • ๋ฐ์ดํ„ฐ๊ฐ€ ์š”์ฒญ๋˜์–ด์ง€๋Š” ์‹œ์ ์—์„œ ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)๋ฅผ ์ „๋‹ฌ
      • JSON ํ˜น์€ XML๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
  • ์›”๋“œ ์™€์ด๋“œ ์›น(www)๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ ํ˜•์‹
    • REST๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น์˜ ๊ธฐ์กด ๊ธฐ์ˆ ๊ณผ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ
    • REST๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ Client์™€ Server ์‚ฌ์ด์˜ ํ†ต์‹  ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜

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

  • ์ž์›(Resource): URI
    • ๋ชจ๋“  ์ž์›์— ๊ณ ์œ ํ•œ ID๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด ์ž์›์€ Server์— ์กด์žฌ
    • ์ž์›์„ ๊ตฌ๋ณ„ํ•˜๋Š” ID๋Š” โ€˜/groups/:group_idโ€™์™€ ๊ฐ™์€ HTTP URI
    • Client๋Š” URI๋ฅผ ์ด์šฉํ•ด์„œ ์ž์›์„ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)์— ๋Œ€ํ•œ ์กฐ์ž‘์„ Server์— ์š”์ฒญ
  • ํ–‰์œ„(Verb): HTTP Method
    • HTTP ํ”„๋กœํ† ์ฝœ์˜ Method๋ฅผ ์‚ฌ์šฉ
    • HTTP ํ”„๋กœํ† ์ฝœ์€ GET, POST, PUT, DELETE ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณต
  • ํ‘œํ˜„(Representation of Resource)
    • Client๊ฐ€ ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ์š”์ฒญํ•˜๋ฉด Server๋Š” ์ด์— ์ ์ ˆํ•œ ์‘๋‹ต(Representation)์„ ๋ณด๋ƒ„
    • REST์—์„œ ํ•˜๋‚˜์˜ ์ž์›์€ JSON, XML, TEXT, RSS ๋“ฑ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ Representation์œผ๋กœ ๋‚˜ํƒ€๋‚ด์–ด ์งˆ ์ˆ˜ ์žˆ์Œ
    • JSON ํ˜น์€ XML๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
profile
๐ŸŒฑ Backend-Dev | hwaya2828@gmail.com

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