๋ธ๋ก๊ทธ ์ฎ๊ฒผ์ต๋๋ค! ๐ก integer.blog
์์์์ ํ๋ฝ์ ๋ฐ๊ณ ๋ฒ์ญํ ๊ธ์ ๋๋ค.
์๋ฌธ: When Should You Use Path Variable and Query Parameter?*์ญ์ ์ฃผ:
Spring boot์ Vue.js๋ก ํ์ผ๋ฟ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ ์ค,
์นดํ ๊ณ ๋ฆฌ๋ก ๊ฒ์๋ฌผ ๋ชฉ๋ก์ ํํฐ๋งํ ๋ @PathVariable๋ก ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ์ ์ ๋ฌํ๋๋, ‘/‘๊ฐ ํฌํจ๋ ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ๋ค.
์๊ณ ๋ณด๋, ์ด ๊ธ์์ ์ค๋ช ํ๋ ๊ฒ ์ฒ๋ผ Resource๋ฅผ ๊ฐ์ ธ์ค๋ Get ๋ฉ์๋๋ PathVariable์ ์ฌ์ฉํ๊ณ ,
์ ๋ ฌ(sort)์ด๋ ํํฐ๋ง์ ํ๋ ๊ฒฝ์ฐ QueryParam์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ณ์ ๋ฐฉ๋ฒ์ด์๋ค.
์ด ๊ธ์ ํตํด PathVariable ๊ณผ Query Parameter ๊ฐ ๋ฌด์์ด๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง ์ด์ผ๊ธฐํ๊ณ ์ ํ๋ค.
1. Query Parameter
๋น์ ์ด ์น ๊ฐ๋ฐ์๋ผ๋ฉด, ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ธ GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ ๊ฒ์ด๋ค.
์์
์๋น์ค๋ฅผ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ด๋ฆฌํด์ผ ํ๊ณ , ๋ชจ๋ ์ฌ์ฉ์๋ ์ฌ์ฉ์ ํ์ด์ง๊ฐ ์์ด์ผ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ์ฌ์ฉ์๋ฅผ ์ํ ํ์ด์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด ํ์ด์ง ๋ง๋ค ์๋ณ๋ ํ๋ผ๋ฏธํฐ ๊ฒฝ๋ก๊ฐ ํ์ํ๋ฐ,
๋ค์๊ณผ ๊ฐ์ get ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
/users?id=123 # ์์ด๋๊ฐ 123์ธ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์จ๋ค.
๊ทธ๋ผ ์๋ฒ๋ก ๋ถํฐ id ๋ณ์๋ฅผ ์ป์ ์ ์๋ค. ์ด๊ฒ์ด Query String์ด ๋์ํ๋ ๋ฐฉ์์ด๋ค.
(์ด ๊ธ์์๋ ์๋ฒ๋จ์์์ ๋์๊น์ง๋ ์ค๋ช
ํ์ง ์์ ๊ฒ์ด๋ค.)
2. Path Variable
ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ๋ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก Path Variable๋ ์ฌ์ฉํ ์ ์๋ค.
Path Variable์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
/users/123 # ์์ด๋๊ฐ 123์ธ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ด ๊ฒฝ์ฐ์, 123 ์ ์๋ฒ๋จ์ ์ ๋ฌํ๋ค. ๊ฒฝ๋ก๋ฅผ ๋ณ์๋ก์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
3. ๊ทธ๋ผ Path Variable๊ณผ Query Parameter๋ฅผ ๊ฐ๊ฐ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
๋ง์ฝ ์ด๋ค resource๋ฅผ ์๋ณํ๊ณ ์ถ์ผ๋ฉด Path Variable์ ์ฌ์ฉํ๊ณ ,
์ ๋ ฌ์ด๋ ํํฐ๋ง์ ํ๋ค๋ฉด Query Parameter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด Best Practice์ด๋ค.
/users # ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
/users?occupation=programer # ํ๋ก๊ทธ๋๋จธ์ธ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
/users/123 # ์์ด๋๊ฐ 123์ธ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋ํ, ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋ฅ์ ์ํด์ ๋ ๋ค๋ฅธ URL์ด๋ query parameter๋ฅผ ์ ์ํ ํ์๋ ์๋ค.
๋์ ์ํ๋ ๊ธฐ๋ฅ์ ๋ง๊ฒ HTTP ๋ฉ์๋๋ฅผ ๋ฐ๊พธ์ด์ผ ํ๋ค.
/users [GET] # ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
/users [POST] # ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ค.
/users/123 [PUT] # ์ฌ์ฉ์๋ฅผ ๊ฐฑ์ ํ๋ค.
/users/123 [DELETE] # ์ฌ์ฉ์๋ฅผ ์ญ์ ํ๋ค.
๊ทธ๋ ๋ค! ๊ฑฐ์ ๋ชจ๋ CRUD ํ๋ก์ธ์ค๋ฅผ
์ถ๊ฐ์ ์ธ endpoint(์๋ฅผ ๋ค์ด users/create) ๋๋
query parameter(์๋ฅผ ๋ค์ด users?action=create) ์์ด ์ํํ ์ ์๋ค. ๊ฒ๋ค๊ฐ ๋จ์ํ๊ณ ์์ธก ๊ฐ๋ฅํ๋ค.
4. ์ ๋ฆฌ
์์ ๋งํ ๋ฐฉ๋ฒ๋๋ก ๊ตฌํํ์ง ์์๋ ๋์ํ๋ API๋ฅผ ๋ง๋ค ์๋ ์๋ค.
ํ์ง๋ง ํจ์ฌ ๋ณต์กํด์ง ๊ฒ์ด๊ณ ๊ฐ๋ฐ์๋๋ฅผ ๋ฆ์ถ ๊ฒ์ด๋ค.
๊ฐ๋ฐ ํจ์จ์ ์ต๋ํ ๋์ด ์ฌ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ์ ํ์
์ ๊ณ ๋ คํ๋ฉด, ํ์ค์ด ๋๋ ๋ฐฉ๋ฒ๊ณผ best practice๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข๋ค.
๋ง์ง๋ง์ผ๋ก, References์ ๋งํฌ๋ค์ ํตํด RESTful API๋ฅผ ์ค๊ณํ๋ ๋ ๋ค๋ฅธ best practice๋ค์ ํ์ธํ ์ ์๋ค.
References
- Best Practices for Designing a Pragmatic RESTful API
- RESTful API Designing guidelinesโโโThe best practices
- RESTful API Design. Best Practices in a Nutshell