지금까지 개발한것은 필드오류가 발생하면 입력값이 남아있지 않고 지워진다.
하지만 FieldError부분을 약간만 손봐주면 오류 발생시 입력값을 남아있도록 해줄 수 있다.
<Controller 수정>
@PostMapping("/add")
public String addItemV2(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
//검증 로직
if(!StringUtils.hasText(item.getItemName())){
// errors.put("itemName","상품 이름은 필수입니다.");
bindingResult.addError(new FieldError("item","itemName",item.getItemName(),false,null,null,"상품 이름은 필수입니다."));
}
if(item.getPrice() == null || item.getPrice()<1000 || item.getPrice() >1000000){
// errors.put("price", "가격은 1,000 ~ 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){
// errors.put("quantity","수량은 최대 9,999 까지 허용합니다.");
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){
// errors.put("globalError","가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = "+resultPrice);
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}";
}
FieldError는 두가지 생성자를 가진다.
bindingResult.addError(new FieldError("item","itemName",item.getItemName(),false,null,null,"상품 이름은 필수입니다."));
FieldError의 생성자는 아래 코드와 같은 형식을 가진다.
public FieldError(String objectName, String field, @Nullable Object
rejectedValue, boolean bindingFailure, @Nullable String[] codes, @Nullable
Object[] arguments, @Nullable String defaultMessage)
objectName : 오류가 발생한 객체 이름
field : 오류 필드
rejectedValue : 사용자가 입력한 값(거절된 값)
bindingFailure : 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 값
codes : 메시지 코드
arguments : 메시지에서 사용하는 인자
defaultMessage : 기본 오류 메시지
만약 잘못된 필드값을 입력하였을 경우 rejectedValue에 오류발생시 사용자 입력값이 저장되기 때문에 오류가 발생했을때도 잘못된 입력값이 없어지지 않을 수 있다.
<실행 결과>
'BackEnd > spring' 카테고리의 다른 글
Bean Validation (0) | 2024.08.01 |
---|---|
Validator 분리 (1) | 2024.07.31 |
검증 - BindingResult (0) | 2024.07.26 |
검증(직접 처리) (0) | 2024.07.25 |
웹 애플리케이션에 국제화 적용하기 (0) | 2024.07.24 |