[Java/SpringBoot] @RequestParam vs @PathVariable 쓰임새, 사용법, 차이점

Dong Eun Lee·2021년 12월 14일
6

@어노테이션

목록 보기
1/1
post-custom-banner

스프링을 통한 MVC패턴으로 구현 시, Controller 단에서 흔히 사용하는 @RequestParam 어노테이션과 @PathVariable의 쓰임새, 사용법, 차이점에 대해 알아보겠습니다.



1. @RequestParam과 @PathVariable의 쓰임과 차이


  • 위 2개의 어노테이션은 http의 비연결성을 극복하고 데이터를 전달하기 위한 방법들 중 하나로, uri를 통해 전달된 값을 파라미터로 받아오는 역할을 합니다. 쓰임이 비슷하여 자칫 혼동될 수 있으니 비교해보도록 하겠습니다!
  • uri를 통해 값을 전달하는 방식은 2가지가 있습니다.
    - http://localhost:8000/board?page=1&listSize=10
    - http://localhost:8000/board/1

  • 이 예시에서 쉽게 생각하면, 쿼리스트링을 사용하여 여러개의 값을 전달하는 첫번째 방식은 @RequestParam을 통해 받아오고, 두번째 방식은 @PathVariable을 사용하여 받아올 수 있습니다. 좀 더 자세하게 차이점을 알아보겠습니다.




2. @RequestParam 어노테이션 사용법!


제 게시판 프로젝트의 API 를 참고해서 설명드리겠습니다.

예시 1)

	@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";
	}
    

게시글 리스트를 받아오는 api입니다. 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

출처 : https://wikidocs.net/152630




3. @PathVariable 어노테이션 사용법!

예시 2)

	@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(), ...);
	}
    

이번에는 @PathVariable입니다. 위에서 간략히 말씀드렸듯이, 쿼리스트링으로 전달되는 경우 외에 uri에 전달되는 값을 받아오는 역할을 합니다. 주로 post 요청에 많이 씁니다.

중요 : @PathVariable은 어떤 요청이든 간에 딱 하나만 쓸 수 있습니다.

그래서 쿼리스트링이 있는 uri에는 안쓰고 주로 post요청에 많이 쓰는거군요!


그런데 잠깐,,,

여기에도 RequestParam 어노테이션이 있네요. 예시 2는 게시물을 수정 요청하는 api인데요.
원래 @RequestBody 라는 어노테이션을 통해 Body값에 Json형태로 담아오는 ajax요청을 받아주도록 했는데, 파일 업로드를 구현하면서 files 를 같이 가져와야해서 string 형태의 데이터로 받을수 없었습니다.
그래서 @RequestParam을 통해 key-value 형태로 받아오도록 했습니다.

그래서 배운점?

꼭 primitive type이 아니어도!
꼭 uri를 통해 값을 받아오지 않아도!
@RequestParam으로 인자값을 가져올 수 있습니다.



4. 정리/요약

1) @RequestParam 과 @PathVariable은 둘 다 데이터를 받아오는 데에 사용한다!

2) @PathVariable은 값을 하나만 받아올 수 있으므로, 쿼리스트링 등을 이용한 여러 개 데이터를 받아올 때는 @RequestParam을 쓴다!

3) @RequestParam은 uri를 통해 전달된 값이 아니더라도, ajax 요청을 통해 body에 담아온 데이터를 여러 타입으로 받을 수 있다.



포스팅을 마치겠습니다. 감사합니다.

profile
하고 싶은게 너무 많아 고민인 주니어 개발자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 4월 4일

안녕하세요 ㅎㅎ 글 잘 읽었습니다!! 글을 읽던 중 궁금한점이 있어 댓글 남겨요!!
정리/요약 부분에 @PathVariable은 값을 하나만 받아올 수 있다고 되어있는데 @PathVariable도 값을 여러개 받아올 수 있는걸로 알고있습니다

답글 달기