Spring Boot/STUDY

[Spring] @PathVariable과 @RequestParam 차이점

코맹 2024. 9. 26. 11:12

회사 코드를 리뷰하던 중 @PathVariable과 @RequestParam을 하나의 메서드에서 함께 쓰길래 차이점이 궁금해서 찾아봤다😵‍💫

 

@PathVariable과 @RequestParam 모두 URI를 통해 전달된 값을 파라미터로 받아오기 위해 사용한다는 것은 알고 있었지만, 어떤 차이가 있는지는 잘 몰랐다.

 

 

 

✔️ @RequestParam과 @PathVariable의 차이

  • 우선 두 어노테이션 모두 http의 비연결성을 극복하고 데이터를 전달하기 위한 방법 중 하나로, URI를 통해 전달된 값을 파라미터로 받아오는 역할을 한다.
  • URI를 통해 값을 전달하는 방식
    • http://localhost8080/home?page=1&size=10
    • http://localhost8080/home1
  • 쿼리스트링을 사용하여 여러 개의 값을 전달하는 첫번째 방식은 @RequestParam
  • 두번째 방식은 @PathVariable을 사용하여 받아온다.

 

✔️ @RequestParam 어노테이션 사용방법

@GetMapping({"board", "board?page={page}&listsize={listsize}"})
public String getBoardList(Model model
			, @RequestParam(value = "page", required = false, defaultValue = "1") int page
 			, @RequestParam(value = "listSize", defaultValue = "10") int listSize
			) throws Exception {
          
		.
		.
		.
		return "board/boardList";
          }
  • GET 요청을 받으면 쿼리스트링을 통해 전달된 page와 listSize 값을 받아와서 @RequestParam을 통해 파라미터인 int page와 int listSize에 각각 대입해준다.

 

괄호 안 속성
  • value: URI에서 바인딩하게 될 값
  • required = true일 때, 필수적으로 값이 전달되어야 하며 없으면 에러
  • defaultValue: 값이 없을 때 기본값으로 사용할 값
더보기
  • 컨트롤러 메서드에서 아무런 어노테이션없이 String 등 Request와 관련 없는 타입의 파라미터가 선언되었을 경우 스프링은 @RequestParam(required = false, value = {변수명}) 이라고 가정한다.
@RequestParam(value = "value", required = false) String value

String value
  •  즉, 위 두 줄의 코드는 동일한 의미를 가진다.

 

✔️ @PathVariable 어노테이션 사용방법

@ResponseBody
@PostMapping("/board/{id}")
public ResponseDto<Integer> updateBoard(@PathVariable("id") int id
					, @RequestParam Map<String, Object> params
					, MultipartFile[] files) throws Exception {
	Board board = new Board();
	board.setId(id);
	board.setTitle((String) params.get("title"));
	board.setContent((String) params.get("content"));
	.
	.
	.
	return new ResponseDto<Integer>(HttpStatus.OK.value(), ...);
}
  • 쿼리스트링 외에 URI에 전달되는 값을 받아오는 역할을 한다.
  • 주로 POST 요청에서 자주 쓰인다

 

 

✔️ 정리

  • @RequestParam과 @PathVariable은 URI에 전달되는 값 즉, 데이터를 받아오는 데 사용한다.
  • @PathVariable은 값을 하나만 받아올 수 있으므로, 쿼리스트링 등을 이용한 여러 개의 데이터를 받아올 때는 @RequestParam을 쓴다.
  • @RequestParam은 URI 뿐만 아니라, AJAX 요청을 통해 body에 담아온 데이터를 여러 타입으로 받을 수 있다.