@RequestParam @PathVariable 차이는 URI를 어떻게 전달하느냐에 따라 어떤 것을 쓸지 결정하면 된다.
Case 1) http://xxx.x.x?index=1&page=2 //@RequestParam
Case 2) http://xxx.x.x/index/1 //@PathVariable
여러개의 데이터를 받아오는 첫번째 방식은 @RequestParam을 통해 받아오고, 한가지만 받아오려면 @PathVariable을 사용하면 된다.
쉽게 생각하면, 보통 @RequestParam은 파라미터의 값과 이름을 함께 전달하는 방식으로 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식으로 많이 사용된다.
@PathVariable은 id와 같이 필수로 입력되어야 하는 값이면 @PathVariable을 사용하여 구현하면 된다.
Rest api에서 값을 호출할 때
@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";
}
위 코드는 게시판 글 리스트를 받아오는 api다. get 요청을 받으면 쿼리스트링을 통해 전달된 page값과 listSize값을 받아와서 @RequestParam이 파라미터인 int page와 int listSize에 각각 대입해준다.
@RequestParam은 이처럼 하나 이상의 타입을 적용할 수 있다.
괄호 안의 속성 값은 이렇다.
- value : URI에서 바인딩하게 될 값
- required = true일 시, 필수적으로 값이 전달되어야 하며, 그렇지 않다면 Error 발생
- defaultValue = " " : 값이 없을 때 기본적으로 사용할 값
@PathVariable 사용 예시
@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은 어떤 요청이든 간에 딱 하나만 쓸 수 있다.

클라이언트에서 서버로 통신 = 요청(request)
서버에서 클라이언트로 통신 = 응답(response)
@RequestBody
JSON ➡ 자바 객체
클라이언트에서 데이터를 요청하기 위해 JSON 데이터를 HTTP 요청 바디에 담아서 서버로 보내면
서버에서는 HTTP 요청 바디에 담긴 값들을 자바 객체로 변환시켜 객체에 저장한다.
클라이언트 -> 서버로
받아온다는 개념이다. 즉 클라이언트의 JSON 값들을 받아와 자바 객체로 바꾸어 사용해야 할 때
// 객체
public class Entity{
private Long id;
private String name;
private String address;
}
// API Controller
@PostMapping("/api/post")
public void requestTest(@RequestBody Entity entity) {
System.out.println("id = " + entity.id);
System.out.println("name = " + entity.name);
System.out.println("address = " + entity.address);
}
POST /api/post HTTP/1.1
{
"id": 1,
"name" : "user1"
}
이와 같은 내용을 HTTP Body에 담아서 POST 요청을 보내게 될 경우,
@RequestBody는 본문의 내용을 매핑해서 객체를 생성한다.
- entity.id // 1
- entity.name // "user1"
- entity.address // null
요청 보낸 JSON값을 자바 객체로 변환시켜 @RequestBody 어노테이션이 붙은 변수에 담아 저장한다.
@ResponseBody
자바 객체 ➡ JSON
@RestController는 리턴값에 자동으로 @ResponseBody가 붙게되어 별도의 어노테이션을 명시해주지 않아도 된다.
서버 -> 클라이언트
출처
'Spring' 카테고리의 다른 글
[Spring] Spring MVC 동작 원리 (0) | 2023.10.25 |
---|---|
[Spring] 스프링 JPA 정리 (0) | 2023.10.25 |
[Spring] 도메인 (0) | 2023.10.24 |
[Spring] lombok 어노테이션 정리와 주의사항 (0) | 2023.10.24 |
[Spring]@RequestMapping과 @GetMapping, @PostMapping, @DeleteMapping, @PutMapping (1) | 2023.10.11 |