클라이언트에서 서버로 데이터를 전달하는 방법은 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)
도 마찬가지다.