회사 코드를 리뷰하던 중 @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에 담아온 데이터를 여러 타입으로 받을 수 있다.
'Spring Boot > STUDY' 카테고리의 다른 글
[Spring] Maven과 Gradle 개념 및 비교 (3) | 2024.08.29 |
---|---|
[Spring] Mapper와 Repository의 차이 (0) | 2024.08.08 |
[Spring Boot] 타임리프(Thymeleaf)란? (0) | 2024.07.17 |
[Spring Boot] React연동 프로젝트(4) - 상세 화면 (0) | 2024.07.04 |
[Spring Boot] React연동 프로젝트(3) - 회원가입 및 로그인 기능 구현 (1) | 2024.07.04 |