[๋ฒˆ์—ญ] Path Variable๊ณผ Query Parameter๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ 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