@RequestParam
: String, int, Integer 같은 단순 타입을 받을 때 사용
@ModelAttribute
: 위에서 적은 외 나머지 (객체)를 받을 때 사용
✅ @RequestParam
HttpServlet 객체를 이용해서 데이터를 받음
@RequestParam 어노테이션을 통해서 데이터 받음
HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 안의 값 생략 가능
HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 자체를 생략 가능
기본적으로 required는 true가 기본값으로, 해당 파라미터가 넘어오지 않으면 오류 발생한다
하지만 false로 설정할 경우, 데이터가 넘어오지 않아도 오류가 발생하지 않고 null값으로 저장
파라미터 값을 보내지 않으면 기본 지정한 값으로 들어옴
defaultValue는 빈 문자의 경우에도 설정한 기본 값이 적용됨
파라미터 값을 Map으로 저장할 수 있음
소스코드
@Slf4j
@Controller
public class RequestParamController {
@RequestMapping("/request-param-v1") // v1 버전 -> HttpServlet을 이용해서 데이터 받음
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
log.info("username={}, age={}",username,age);
response.getWriter().write("OK");
}
@ResponseBody // RestController와 같은역할로 뷰조회가 아닌, HTTP message body에 직접 해당 리턴문자로 반환
@RequestMapping("/request-param-v2") // v2버전 -> @RequestParam 어노테이션을 통해서 데이터 받음
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge){
log.info("username={}, age={}",memberName,memberAge);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-v3") // v3버전 -> HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 안의 값 생략 가능
public String requestParamV3(
@RequestParam String username,
@RequestParam int age){
log.info("username={}, age={}",username,age);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-v4") // v4버전 -> HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 자체를 생략 가능
public String requestParamV4(String username, int age){
log.info("username={}, age={}",username,age);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age){ // default = true값으로 파라미터를 보내지 않으면 오류남
// null을 int에 입력하는것을 불가능 (500에러) -> Integer로 변경하거나, defaultValue 사용
log.info("username={}, age={}",username,age);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username, // 파라미터값을 보내지않으면 guest로 보내짐
@RequestParam(required = false, defaultValue = "-1") int age){ // 파라미터값을 보내지 않으면 -1로 보내짐
log.info("username={}, age={}",username,age);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap){
log.info("username={}, age={}",paramMap.get("username"),paramMap.get("age"));
return "ok";
}
✅ @ModelAttribute
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData){
// 1. HelloData 객체를 생성함 2. 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.
// 3. 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력한다.
// 4. 파라미터 이름이 username이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다
log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
return "ok";
}
@ResponseBody
@RequestMapping("/model-attribute-v2") // @ModelAttribute 어노테이션 자체를 생략가능
public String modelAttributeV2(HelloData helloData){
log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
return "ok";
}
// @PostMapping("/add") // form으로 넘어온 값들을 @RequestParam을 통해 값을 저장
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";
}
//@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item){
itemRepository.save(item);
// model.addAttribute("item",item); // @ModelAttribute로 인해서 자동으로 추가되므로 생략 가능함
// @ModelAttribute 안에 "item"은 model.addAttribute("item",item); 도 포함되있음
return "basic/item";
}
//@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item){ // ModelAttribute 이름 생략시 -> model에 저장되는 name은 클래스명 첫글자만 소문자로 등록
// 위 클래스명은 Item 이므로 Item -> item
// @ModelAttribute에 item으로 담기게 됨
itemRepository.save(item);
return "basic/item";
}
@PostMapping("/add")
public String addItemV4(Item item){ // ModelAttribute 어노테이션 자체를 생략 가능
itemRepository.save(item);
return "basic/item";
}