특정 대상을 지목할 때는 PathVariable을 사용하고,
정렬Sort나 필터링Filtering, 여러정보를 전달 하는 경우 QueryParam을 사용하는 것이 옳은 방법
위의 어노테이션들은 모두 view로부터 값을 가져오기 위한 어노테이션이다.
@Controller
public class UserController {
@PostMapping("/receive")
public String age(@RequestBody String req) {
System.out.println("통신 성공");
System.out.println(">>> " + req);
return "result";
}
}
//출력 결과
//통신 성공
//>>> name=jun&age=13
위의 값을 @RequestBody로 전송한 결과
name=jun&age=13
이라는 String으로 전달된다.
@Controller
public class UserController {
@PostMapping("/receive")
public String age(@RequestParam String name) {
System.out.println("통신 성공");
System.out.println(">>> " + name);
return "result";
}
}
//출력 결과
//통신 성공
//>>> jun
@RequestParam = 클라이언트가 요청한 URL의 쿼리 파라미터에 대한 값을 받아온다(url 상에서 데이터를 찾음)
/users?id=123 # 아이디가 123인 사용자를 가져온다.
기본적으로 required = true이기 때문에 어노테이션을 사용하면 기본적으로 해당하는 key값과 value가 url상에 무조건 나타나야 한다.
만약 쿼리 파라미터가 필수가 아니게 하려면
@RequestParam(value="name", required=false) string msg
처럼 작성한다
만약
required=true
일 때, 값을 입력하지 않거나 잘못 입력하면 에러 발생
만약required=false
일 경우, default 값을 줘야 한다.
@RequestBody | @RequestParam | |
---|---|---|
객체 생성 | 가능 | 불가능 |
각 변수별로 데이터 저장 | 불가능 | 가능 |
데이터를 넘기는 또 다른 방법
/users/123 # 아이디가 123인 사용자를 가져온다
만약 어떤 resource를 식별하고 싶으면 Path Variable을 사용하고,
정렬이나 필터링을 한다면 Query Parameter를 사용하는 것이 Best Practice이다.
/users # 사용자 목록을 가져온다.
/users?occupation=programer # 프로그래머인 사용자 목록을 가져온다.
/users/123 # 아이디가 123인 사용자를 가져온다.
또한, 기본적인 CRUD 기능을 위해서 또 다른 URL이나 query parameter를 정의할 필요는 없다.
대신 원하는 기능에 맞게 HTTP 메소드를 바꾸어야 한다.
/users [GET] # 사용자 목록을 가져온다.
/users [POST] # 새로운 사용자를 생성한다.
/users/123 [PUT] # 사용자를 갱신한다.
/users/123 [DELETE] # 사용자를 삭제한다.
@ModelAttribute: 매개변수에 Model model이 없어도 스프링에서 자동으로 만들고 넣어주는 어노테이션
@ModelAttribute = 적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션
//2번 예시
@PostMapping
public String addItem(@ModelAttribute(name="item") Item item, Model model) {
itemRepository.save(item);
// model.addAttribute("item", item);
return "item";
}
@RequestParam으로 요청 파라미터를 받았으면, 모델객체에 데이터를 넣어줘야 view 쪽에서 데이터를 사용할 수 있다.
하지만 @ModelAttribute를 사용했을 경우에는 모델에 넣는 코드가 없어도 스프링에서 자동으로 넣어준다.
@PostMapping("/add")
public String addItemV1(@RequestParam String itemName,
@RequestParam int price,
@RequestParam Integer quantity,
Model model) {
Item item = new Item();
item.setItemName(itemName);
item.setPrice(price);
item.setQuantity(quantity);
itemRepository.save(item);
model.addAttribute("item", item);
return "basic/item";
}
파라미터 값이 넘어올 때 @RequestParam을 사용하면 파라미터 하나에 변수를 하나씩 생성해줘야 하고, 이 값을 뷰로 넘기려면 Model을 이용하여 데이터를 전송하기 때문에 번거로울 수 있다.
@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item) {
itemRepository.save(item);
return "basic/item";
}
Item이라는 DTO역할을 하는 클래스를 선언하여 객체 item으로 데이터를 주고 받는다.
@RequestParam이랑 비교하면 파라미터를 따로 받을 필요도 없고, Model을 호출하여 객체 바인딩을 할 필요도 없다.
@ModelAttribute("item") 이렇게 선언하면 Model에 item이라는 이름으로 객체를 넣어준다
@ModelAttribute Item item
-> item참고
[번역] Path Variable과 Query Parameter는 언제 사용해야 할까?
@RequestParam
@ModelAttribute
@ModelAttribute