Copy @ Slf4j
@ Controller
@ RequestMapping ( "/validation/v2/items" )
@ RequiredArgsConstructor
public class ValidationItemControllerV2 {
@ PostMapping ( "/add" )
public String addItemV2(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
if (!StringUtils.hasText( item . getItemName ())) {
bindingResult.addError(new FieldError("itemName", "itemName", item.getItemName(), false, null, null, "상품 이름은 필수입니다."));
}
if (item.getPrice() == null || item.getPrice() < 1000 || item . getPrice () > 1_000_000) {
bindingResult.addError(new FieldError("item", "price", item.getPrice(), false, null, null, "가격은 1,000원에서 1,000,000원까지 허용합니다."));
}
if (item.getQuantity() == null || item.getQuantity() >= 9999) {
bindingResult.addError(new FieldError("item", "quantity", item.getQuantity(), false, null, null, "수량은 최대 9,999까지 허용합니다."));
}
if (item.getPrice() != null && item.getQuantity() != null) {
int resultPrice = item . getPrice () * item . getQuantity ();
if (resultPrice < 10000 ) {
// objectError는 기존 값이 있는 게 아니므로 fieldError 같은 생성자는 없다.
bindingResult.addError(new ObjectError("item", null, null, "가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice));
}
}
if (bindingResult.hasErrors()) {
log . info ( "errors={}" , bindingResult);
return "validation/v2/addForm" ;
}
// 성공 로직
Item savedItem = itemRepository . save (item);
redirectAttributes. addAttribute ( "itemId" , savedItem.getId());
redirectAttributes. addAttribute ( "status" , true);
return "redirect:/validation/v2/items/{itemId}" ;
}
}