Spring @RequestParam vs @PathVariable ์ ๋ ธํ ์ด์ ๋น๊ต
@PathVariable
- ๋ชฉ์ : URI ๊ฒฝ๋ก์ ๋ณ์ ๊ฐ์ ์ถ์ถํ ๋ ์ฌ์ฉ
- ์์: /users/{userId} → userId ํ๋ผ๋ฏธํฐ ์ถ์ถ
- ํน์ง:
- URL์ ๊ฒฝ๋ก ์ผ๋ถ๋ก ์ฌ์ฉ๋๋ฉฐ ํ์๊ฐ์ผ๋ก ์ฒ๋ฆฌ๋จ
- RESTful ๋ฆฌ์์ค ์๋ณ์ ์ ํฉ (์: ํน์ ์ฌ์ฉ์ ์กฐํ)
@GetMapping("/users/{userId}")
public User getUser(@PathVariable String userId) {
//
}
@RequestParam
- ๋ชฉ์ : ์ฟผ๋ฆฌ ์คํธ๋ง(?key=value)์ ํ๋ผ๋ฏธํฐ ์ถ์ถ
- ์์: /users?role=admin → role ๊ฐ ์ถ์ถ
- ํน์ง:
- ์ ํ์ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ (required=false)
- ํํฐ๋ง, ์ ๋ ฌ, ํ์ด์ง ๋ฑ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ํฉ
@GetMapping("/users")
public List<User> getUsers(@RequestParam(required = false) String role) {
//
}
์์ฒญ ๊ฐ์ ์ฒ๋ฆฌ ์ ์ธ์ฝ๋ฉ ๋ฐฉ์ ์ฐจ์ด
@PathVariable
URL ๊ฒฝ๋ก์์ ๊ฐ์ ์ถ์ถํ ๋ ์ธ์ฝ๋ฉ๋์ง ์์ ์๋ณธ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ๋ค. ์๋ฅผ ๋ค์ด, URL์ ab+c๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๊ทธ๋๋ก ab+c๋ฅผ ๋ฐํํ๋ค.
- http://localhost:8080/spring-mvc-basics/foos/ab+c
- ๊ฒฐ๊ณผ: ID: ab+c
@RequestParam:
์ฟผ๋ฆฌ ์คํธ๋ง์ ๊ฒฝ์ฐ, URL ๋์ฝ๋ฉ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ab+c๊ฐ ab c๋ก ๋ณํ๋์ด ๋ฐํ๋๋ค.
- http://localhost:8080/spring-mvc-basics/foos?id=ab+c
- ๊ฒฐ๊ณผ: ID: ab c
๋ฐ๋ผ์, ์ธ์ฝ๋ฉ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ ์ํฉ์์๋ ์ด๋ค ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์ง ์ ์คํ ์ ํํด์ผ ํ๋ค.
์ ํ์ ๊ฐ ์ฒ๋ฆฌ
๋ ์ ๋ ธํ ์ด์ ๋ชจ๋ ์ ํ์ (optional) ๊ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- @PathVariable์ ์ ํ์ ์ฌ์ฉ
Spring 4.3.3๋ถํฐ๋ required ์์ฑ์ ์ฌ์ฉํ์ฌ ์ ํ์ ๊ฒฝ๋ก ๋ณ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"})
@ResponseBody
public String getFooByOptionalId(@PathVariable(required = false) String id){
return "ID: " + id;
}
- ํธ์ถ ์์
- URL: http://localhost:8080/spring-mvc-basics/myfoos/optional/abc → ๊ฒฐ๊ณผ: ID: abc
- URL: http://localhost:8080/spring-mvc-basics/myfoos/optional → ๊ฒฐ๊ณผ: ID: null
- @RequestParam์ ์ ํ์ ์ฌ์ฉ
@RequestParam ๋ํ required ์์ฑ์ ์ฌ์ฉํ์ฌ ํ์ ์ฌ๋ถ๋ฅผ ์ง์ ํ ์ ์๋ค.๋จ, ๊ฒฝ๋ก์์ ์๊ธธ ์ ์๋ ์ถฉ๋์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง ์์ ๊ณ ๋ ค์ฌํญ์ ์ฃผ์ํด์ผ ํ๋ค.
์ ํ์ ๊ฐ ์ฒ๋ฆฌ๋ ์ ์ฐํ API ์ค๊ณ์ ๋์์ ์ฃผ์ง๋ง, ๊ฒฝ๋ก ์ถฉ๋์ด๋ ๋ฐ์ดํฐ ๋๋ฝ ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ํด ์ถฉ๋ถํ ๊ฒ์ฆ์ด ํ์ํ๋ค.
์ฃผ์ ์ฐจ์ด์ ๋น๊ต
ํน์ฑ | @PathVariable | @RequestParam |
์์น | URI ๊ฒฝ๋ก ๋ด (/{value}) | ์ฟผ๋ฆฌ ์คํธ๋ง (?key=value) |
ํ์ ์ฌ๋ถ | ๊ธฐ๋ณธ๊ฐ required=true | required=false๋ก ์ ํ์ ์ค์ ๊ฐ๋ฅ |
์ฌ์ฉ ์ฌ๋ก | ๋ฆฌ์์ค ์๋ณ (์: ID ๊ธฐ๋ฐ ์กฐํ) | ํํฐ๋ง, ์ ๋ ฌ, ๊ฒ์ ์กฐ๊ฑด |
URL ๊ตฌ์กฐ | RESTful ๊ณ์ธต ๊ตฌ์กฐ ๋ฐ์ | ๊ธฐ๋ฅ์ ํ๋ผ๋ฏธํฐ ์ ๋ฌ |
์ธ์ฝ๋ฉ | ๊ฐ์ด ๋์ฝ๋ฉ๋์ง ์์(์:ab+c→ab+c) | ๊ฐ์ด ์๋ ๋์ฝ๋ฉ ๋จ(์:ab+c→ab c) |
์ ๋ฆฌ
@PathVariable๊ณผ @RequestParam์ ๊ฐ๊ฐ์ ํน์ง์ ๋ง์ถฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋๊ตฌ์ด๋ค.
- @PathVariable์ URI ๊ฒฝ๋ก ์์ฒด์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ด RESTful API ์ค๊ณ ์ ์์ฐ์ค๋ฌ์ด URL ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
- @RequestParam์ ์ฟผ๋ฆฌ ์คํธ๋ง์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ๋ ์ ์ฉํ๋ฉฐ, URL ๋์ฝ๋ฉ ์ฒ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ์ธ์ฝ๋ฉ ์ด์๊ฐ ์ฐ๋ ค๋๋ ๊ฒฝ์ฐ(์: ๊ฐ์ +๋ ๊ณต๋ฐฑ ๋ฑ์ ํน์๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋ณธ ๊ทธ๋๋ก์ ๊ฐ์ด ํ์ํ ๋)๋ @PathVariable์ ์ฌ์ฉํ๊ณ , ์ผ๋ฐ์ ์ธ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ์๋ @RequestParam์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค.
์ฐธ๊ณ ์๋ฃ :
https://www.baeldung.com/spring-requestparam-vs-pathvariable