NoTimeForDawdling

@PathVariable과 @RequestParam의 차이점 본문

SpringBoot

@PathVariable과 @RequestParam의 차이점

Room_Energy 2021. 2. 18. 20:34

@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 속성을 사용할 수 있습니다.

참고