클라이언트에서 서버로 데이터를 전달하는 방법은 3가지 방법뿐이다.
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
return "ok";
}
쿼리 파라미터로 username=kim&age=20 온 데이터가 memberName, memberAge에 바인딩되게 된다. 결국은 @RequestParam("username") String memberName가 request.getParameter("username")과 같은 효과이다.
public String requestParamV2(
@RequestParam String memberName,
@RequestParam int age
) {
return "ok";
}
@RequestParam(name="xx") 생략 가능하다. @RequestParam String username으로 쓸 수 있다. 대신 쿼리 파라미터 키 값(username)과 파라미터 username이 일치해야한다.
public String requestParamV4(String username, int age) {
return "ok"
더 나아가서 , String, int, Integer 단순 타입이면 @RequestParam도 생략 가능.
파라미터 필수 여부와 Default Value
@RequestParam(required = false, defaultValue = "-1") int age 와 같이 파라미터 필수 여부를 정하는 required(디폴트는 true)와 파라미터가 필수라는 조건이 있어도 defaultValue로 기본값으로 적용할 수 있다.
요청 파라미터를 객체로 받아서 바인딩할 수 있다.
바인딩 받을 객체를 만들어 보자.
@Data
public class HelloData {
private String username;
private int age;
}
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(),
helloData.getAge());
return "ok";
}
@ModelAttribute는 다음과 같이 실행한다.
HelloData 객체를 생성한다.HelloData객체의 프로퍼티를 찾는다. 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 바인딩 한다.username이면 setUsername()메소드를 찾아서 호출하면서 값을 입력한다.@ModelAttribute도 생략할 수 있다.
프로퍼티
객체에getUsername(),setUsername()메소드가 있으면,username이라는 프로퍼티를 가지고 있다.
username프로퍼티 값을 변경하려면setUsername()가 호출되고, 조회하면getUsername()가 호출된다.
@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item, Model model) {
itemRepository.save(item);
model.addAttribute("item", item); //자동 추가, 생략 가능
return "basic/item";
}
@ModelAttribute가 model.attribute()의 역할도 한다.
모델에 데이터를 담을때는 이름이 필요하다. @ModelAttribute의 name속성을 사용한다. 그래서 @ModelAttribute("item") Item item는 model.addAttribute("item",item)과 같은 역할을 한다.
@ModelAttribute("hello") Item item이면 model.addAttribute("hello",item) 모델 hello의 이름으로 item데이터가 담긴다.
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item) {
itemRepository.save(item);
return "basic/item";
}
@ModelAttribute의 name속성을 생략하면 모델에 저장될때 클래스명을 사용한다. 클래스의 첫글자만 소문자로 변경해서 등록한다.
@ModelAttribute Item item이면 model.addAttribute("item",item) 의미한다.@ModelAttribute HelloData helloData이면 model.addAttribute("helloData",helloData)도 마찬가지다.