이제 상품 등록 폼에서 전달된 데이터로 실제 상품을 등록 처리 한다
상품 등록 폼은 다음 방식으로 서버에 데이터를 전달한다.
content-type : application/x-www-form-urlencoded
메세지 바디에 쿼리 파라미터 형식으로 전달 itemName=itemA&price=10000&quantiry=10
ex) 회원 가입, 상품 주문, HTML Form 사용
요청 파라미터 형식을 처리 해야 하므로 @RequestParam
을 사용
@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 String itemName
: itemName 요청 파라미터 데이터를 해당 변수에 받는다.
Item
객체를 생성하고 itemRepository
를 통해서 저장한다.
저장된 item
을 모델에 담아서 뷰에 전달한다.
item.html
뷰 템플릿을 그대로 활용한다.@RequestParam
으로 변수를 하나하나 받아서 Item
을 생성하는 과정은 불편
/**
* @ModelAttribute("item") Item item
* model.addAttribute("item", item); 자동 추가 */
//@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item, Model model){
itemRepository.save(item);
//model.addAttribute("item",item);
return "basic/item";
}
@ModelAttribute - 요청 파라미터 처리
@ModelAttribute
는 Item
객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법(setXxxx)으로 입력해준다.
@ModelAttribute - Model 추가
@ModelAttribute
는 중요한 한가지 기능이 더 있는데, 바로 모델(Model)에 @ModelAttribute
로 지정한 객체를 자동으로 넣어준다. 지금 코드를 보면 model.addttribute("item",item)
가 주석처리 되어 잇어도 잘 동작하는 것을 확인 할 수 있다.
모델에 데이터를 담을 때는 이름이 필요하다. 이름은 @ModelAttribute
에 지정한 name(value)
속성을 사용한다. 만약 다음과 같이 @ModelAttribute
의 이름을 다르게 지정하면 다름 이름으로 모델에 포함 된다.
@ModelAttribute("hello") Item item
-> 이름을 hello
로 지정
model.addAttribute("hello",item)
-> 모델에 'hello'이름으로 저장
📍 주의!
실행전에 이전 버전인 addItemV1
에 @PostMapping("/add")
를 꼭 주석처리 해주어야 한다. 그렇지 않으면 중복 매핑으로 오류가 발생한다.
//@PostMapping("/add") 이전 코드의 매핑 주석처리!
public String addItemV1(@RequestParam String itemName,
/**
* @ModelAttribute name 생략 가능
* model.addAttribute(item); 자동 추가, 생략 가능
* 생략시 model에 저장되는 name은 클래스명 첫글자만 소문자로 등록 Item -> item */
//@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item){
itemRepository.save(item);
return "basic/item";
}
@ModelAttribute
의 이름을 생략 할 수 있다.
📍주의!
@ModelAttribute
의 이름을 생략하면 모델에 저장될 때 클래스명을 사용한다.
이때 클래스의 첫글자만 소문자로 변경해서 등록한다.
ex) @ModelAttribute
클래스명 -> 모델에 자동 추가되는 이름
Item
-> item
HelloData
-> helloData
/**
* @ModelAttribute 자체 생략 가능
* model.addAttribute(item) 자동 추가 */
@PostMapping("/add")
public String addItemV4(Item item){
itemRepository.save(item);
return "basic/item";
}
@ModelAttribute
자체도 생략가능하다. 대상 객체는 모델에 자동 등록된다.
나머지 사항은 기존과 동일하다.