제 게시판 프로젝트의 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에 각각 대입해줍니다.
괄호 안의 속성 값은 각각 이렇습니다.
하나 더 !
컨트롤러 메소드에서 아무런 어노테이션 없이 String 등 Request와 관련 없는 타입의 파라미터가 선언되었을 경우 스프링은 @RequestParam(required=false, value={변수명}) 이라고 가정합니다.
따라서 아래 두 줄의 파라미터는 동일한 의미를 가집니다.
@RequestParam(value = "value", required = false) String value String value
예시 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으로 인자값을 가져올 수 있습니다.
1) @RequestParam 과 @PathVariable은 둘 다 데이터를 받아오는 데에 사용한다!
2) @PathVariable은 값을 하나만 받아올 수 있으므로, 쿼리스트링 등을 이용한 여러 개 데이터를 받아올 때는 @RequestParam을 쓴다!
3) @RequestParam은 uri를 통해 전달된 값이 아니더라도, ajax 요청을 통해 body에 담아온 데이터를 여러 타입으로 받을 수 있다.
안녕하세요 ㅎㅎ 글 잘 읽었습니다!! 글을 읽던 중 궁금한점이 있어 댓글 남겨요!!
정리/요약 부분에 @PathVariable은 값을 하나만 받아올 수 있다고 되어있는데 @PathVariable도 값을 여러개 받아올 수 있는걸로 알고있습니다