먼저 검증 실패시 모델에 오류 결과를 보관해야 함으로 결과를 담을 객체(erros)를 만든다.
그리고 검증 로직을 만들어 유효성을 검증한다. 먼저 특정 필드에 대한 유효성 검증이다
StringUtils.hastext()를 사용하면 글자가 있는지를 확인 가능하다
특정 필드가 아닌 복합 룰에 대한 유효성을 검증하는 로직을 만든다
검증에 실패하면 다시 입력 폼으로 이동한다
@PostMapping("/add")
public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes) {
//검증 오류 결과를 보관
Map<String, String> errors = new HashMap<>();
//필드 검증 로직
if (!StringUtils.hasText(item.getItemName())) {
errors.put("itemName", "상품 이름은 필수입니다");
}
if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
errors.put("price", "가격은 1000이상 1000000 사이여야 합니다");
}
if (item.getQuantity() == null || item.getQuantity() > 9999) {
errors.put("quantity", "수량은 최대 9999개까지 허용합니다");
}
//특정 필드가 아닌 복합 룰 검증
if (item.getPrice()!=null && item.getQuantity() != null){
int resultPrice = item.getPrice() * item.getQuantity();
if (resultPrice<10000){
errors.put("globalError","주문가격 합은 10000원 이상이어야 합니다. 현재 값 :" + resultPrice+ " 원");
}
}
//검증에 실패하면 다시 입력 폼으로
if (!errors.isEmpty()){
model.addAttribute("errors",errors);
return "validation/v1/addForm";
}
//성공 로직
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v1/items/{itemId}";
}