상품 등록 폼을 만들어 보자.
서버에 데이터를 전달해야 하는데
POST - HTML Form
- content-type: application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파리미터 형식으로 전달 itemName=itemA&price=10000&quantity=10
- 예) 회원 가입, 상품 주문, HTML Form 사용
요청 파라미터 형식을 처리해야 해서 @RequestParam을 사용하자.
BasicItemController의 save 부분을 만들어 보자.
// BasicItemController Class
@PostMapping("/add")
public String save
// BasicItemController Class
@PostMapping("/add")
// 파라미터가 오면
public String save(@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";
}
상품을 등록한 대로 상품목록에 반영이 된다.
save 이름을 addItemV1으로 바꾸자.
addItemV2를 만들어 주기 위해 PostMapping도 주석처리를 해주자.
// @PostMapping("/add")
// @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";
}
addItemV2를 만들어 주자. ModelAttribute를 통해서 간단하게 만들 수 있다.
@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item, Model model) {
// ModelAttribute가 자동으로 만들어 준다.
// Item item = new Item();
// item.setItemName(itemName);
// item.setPrice(price);
// item.setQuantity(quantity);
itemRepository.save(item);
model.addAttribute("item", item);
return "basic/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";
}
- @RequestParam으로 변수 하나하나 받아서 Item을 생성하는 과정대신 @ModelAttribute를 썼다.
- 실행전에 이전 버전인 addItemV1 에 @PostMapping("/add") 를 꼭 주석처리 해주어야 한다.
- 아니면 중복 매핑으로 오류가 발생한다.
addItemV2 또한 결과가 잘 나온다.
addItemV3도 만들어 주자.
@ModelAttribute의 item을 생략 가능하다.
// BasicItemController Class
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item, Model model) {
itemRepository.save(item);
//model.addAttribute("item", item); //자동 추가, 생략 가능
return "basic/item";
}
- @ModelAttribute 의 이름을 생략하면 모델에 저장될 때 클래스명을 사용한다. 이때 클래스의 첫글자만 소문자로 변경해서 등록한다.
- 예) @ModelAttribute 클래스명 모델에 자동 추가되는 이름
- Item item
- HelloWorld helloWorld
결과가 잘 나온다.
@ModelAttribute를 생략해서 addItemV4를 만들어 보자.
@PostMapping("/add")
public String addItemV4(Item item) {
itemRepository.save(item);
return "basic/item";
}
- @ModelAttribute 자체도 생략가능하다. 대상 객체는 모델에 자동 등록된다. 나머지 사항은 기존과 동일하다
똑같이 결과가 잘 나오는 것을 확인할 수 있다.
<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring > SpringMVC' 카테고리의 다른 글
PRG Post/Redirect/Get (0) | 2022.05.05 |
---|---|
상품 수정 (0) | 2022.05.04 |
상품 상세, 상품 등록 폼 뷰 & 컨트롤러 (0) | 2022.05.03 |
상품 목록 - 타임리프 (0) | 2022.05.03 |
스프링MVC 프로젝트 - 도메인 개발 & 상품 서비스 HTML (0) | 2022.05.03 |