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
- ? ๋ค์ id๋ ๋ณ์์ ๊ฐ์ ๋ด์ ์ ๋ฌํ๋ ๋ฐฉ์์ด Query string
- users์ ๋ด๊ธด ์ ๋ณด ์ค id 123๋ฒ์ ์๋ฃ๋ฅผ ๋ฌ๋ผ๋ ์์ฒญ
โ Path parameters
/users/123
- ๋์ผํ ์์ฒญ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ์์ฒญํ ์๋ ์๋๋ฐ ์ด๋ฌํ ๋ฐฉ์์ด Path Variable
โ Query string๊ณผ Path variable์ ๊ฐ๊ฐ ์ธ์ ์ฐ๋ฉด ์ข์๊ฐ?
์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์์(๋ฐ์ดํฐ)์ ์์น๋ฅผ ํน์ ํด์ ๋ณด์ฌ์ค์ผ ํ ๊ฒฝ์ฐ Path variable๋ฅผ ์ ์ฉํ๊ณ , ์ ๋ ฌํ๊ฑฐ๋ ํํฐํด์ ๋ณด์ฌ์ค์ผ ํ ๊ฒฝ์ฐ์ Query parameter๋ฅผ ์ ์ฉ
/users
/users?occupation=programer
/users/123
- ์์ ๋ฐฉ์์ผ๋ก ์ด๋์ ์ด๋ค ๋ฐ์ดํฐ(๋ช
์ฌ)๋ฅผ ์์ฒญํ๋ ๊ฒ์ธ์ง ๋ช
ํํ๊ฒ ์ ์ ๊ฐ๋ฅ
- ํ์ง๋ง ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ญ ํ๋ ๊ฒ์ธ์ง ๋์ฌ๋ ๋น ์ ธ์๋๋ฐ, ๋์ฌ ์ญํ ์ ํ๋ ๊ฒ์ด GET, POST, PUT, DELETE ๋ฉ์๋
- ์ฆ, Query string๊ณผ Path variable์ด ์ด๋ค ๋ฉ์๋์ ๊ฒฐํฉํจ์ผ๋ก์จ "ํน์ ๋ฐ์ดํฐ"์ ๋ํ CRUD ํ๋ก์ธ์ค๋ฅผ ์ถ๊ฐ์ ์๋ํฌ์ธํธ ์์ด ์๊ฒฐ ์ง์ธ ์ ์๊ฒ ๋จ
- ์์ ) users/create ํน์ users?action=create๋ฅผ ๊ตณ์ด ๋ช
์ํด ์ค ํ์๊ฐ ์์
/users [GET]
/users [POST]
/users/123 [PUT]
/users/123 [DELETE]
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๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ด ์ผ๋ฐ์