@PathVariable과 @RequestParam의 차이점
@PathVariable과 @RequestParam은 모두 HTTP 요청에서 값을 추출하는데 사용되지만 미묘한 차이가 있습니다.
이름에서 알 수 있듯이 @PathVariable은 URL에서 값을 추출하며, @RequestParam은 URL에서 요청 매개 변수를 가져옵니다.
예제
- HTTP 요청: http://localhost:8080/shop/order/1001/receipts?date=2020-02-18
- @RequstParam: data 매개 변수를 가져올 수 있습니다.
- @PathVariable: orderId, 즉 "1001"을 추출할 수 있습니다.
@GetMapping(value = "/order/{orderId}/receipts")
public void exam(@PathVariable("orderId") int order,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
required = false: Query Parameter가 null일 수도 있음을 나타냅니다.
@RequsetParam을 사용하여 Query Parameters 가져오기
예로 주문 및 거래에 대한 세부 정보를 반환하는 URL이 다음과 같다고 가정해 보겠습니다.
URL: http://localhost:8080/orders?id=1001
위 URL에서 Query Parameters를 이용하기 위해 다음과 같이 코드를 작성했습니다.
@GetMapping("/orders")
public String showOrderDetails(@RequestParam("id") String orderId, Model model){
model.addAttribute("orderId", orderId);
return "orderDetails";
}
만약 Query Parameter 변수의 이름과 Argument 이름이 동일한 경우 Query Parameter의 이름을 지정하지 않고 @RequestParam을 사용할 수 있습니다.
URL: http://localhost:8080/orders?orderId=1001
@GetMapping("/orders")
public String showOrderDetails(@RequestParam String orderId, Model model){
model.addAttribute("orderId", orderId);
return "orderDetails";
}
위 코드는 Query Parameter의 이름을 따로 지정하지 않았습니다. Query Paramter 변수 이름과 Argument 이름이 동일하기 때문입니다.
@PathVariable을 사용하여 값 추출하기
@PathVariable은 URL 자체에서 일부 값을 얻는 데 사용됩니다.
예로 ISBN 번호를 사용하여 책을 검색하는 URL이 다음과 같다고 가정해보겠습니다.
URL: http://localhost:8080/book/1001
위 URL에서 ISBN 값을 추출하기 위해 다음과 같이 코드를 작성했습니다.
@GetMapping(value = "/book/{ISBN}", method = RequestMethod.GET)
public String showBookDetails(@PathVariable("ISBN") String id, Model model) {
model.addAttribute("ISBN", id);
return "bookDetails";
}
@RequestParam과 마찬가지로 Variable 이름과 Argument 이름이 동일하면 값 속성을 생략할 수 있습니다.
@GetMapping(value = "/book/{ISBN}", method = RequestMethod.GET)
public String showBookDetails(@PathVariable String ISBN, Model model) {
model.addAttribute("ISBN", ISBN);
return "bookDetails";
}
@PathVariable과 RequestParam의 차이점
- @RequestParam의 Query Parameter를 추출하는데 사용되며, @PathVariable은 URL에서 바로 데이터를 추출하는데 사용됩니다.
- URL을 통해 같은 값을 포함하지만 RESTful Web Service에서는 @PathVariable이 더 적합합니다.
- URL 자체에서 일부 값을 얻기 때문입니다.
- @RequestParam은 required 속성 및 defaultValue 속성을 사용하여 비어있는 경우 기본값을 지정할 수 있습니다.
- Spring 4.3.3부터 @PathVariable에서 required 속성을 사용할 수 있습니다.