-
오류 코드와 메시지 처리스프링/스프링 MVC 패턴 2023. 2. 23. 14:44
FieldError는 2가지의 생성자를 제공한다.
public FieldError(String objectName, String field, String defaultMessage);
public FieldError(String objectName, String field, @Nullable Object rejectedValue, boolean bindingFailure, @Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage)첫 번째는 위에서 계속 소개한 방식이고 두 번째는 다음과 같다.
bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false, new String[]{"required.item.itemName"}, null, null));}
첫 번째 코드와 차이점은 메시지화를 해서 원하는 메시지를 출력하는 것이다.
defaultMessage 값은 null로 들어가 있지만 errors.properties에서 required.item.itemName을 찾아 해당 문자를 출력해준다.
errors.properties
required.item.itemName=상품 이름은 필수입니다. range.item.price=가격은 {0} ~ {1} 까지 허용합니다. max.item.quantity=수량은 최대 {0} 까지 허용합니다. totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}
rejectValue
bindingResult.rejectValue("itemName", "required");
bindingResult.rejectValue()를 통해 에러 메시지를 출력할 수 있다.
errors.properties
required.item.itemName=상품 이름은 필수입니다. range.item.price=가격은 {0} ~ {1} 까지 허용합니다. max.item.quantity=수량은 최대 {0} 까지 허용합니다.#Level2 - 생략 #Level3 required.java.lang.String = 필수 문자입니다. required.java.lang.Integer = 필수 숫자입니다. min.java.lang.String = {0} 이상의 문자를 입력해주세요. min.java.lang.Integer = {0} 이상의 숫자를 입력해주세요. range.java.lang.String = {0} ~ {1} 까지의 문자를 입력해주세요. range.java.lang.Integer = {0} ~ {1} 까지의 숫자를 입력해주세요. max.java.lang.String = {0} 까지의 문자를 허용합니다. max.java.lang.Integer = {0} 까지의 숫자를 허용합니다. #Level4 required = 필수 값 입니다. min= {0} 이상이어야 합니다. range= {0} ~ {1} 범위를 허용합니다. max= {0} 까지 허용합니다.
level 1, 3, 4가 있는데, 레벨 1이 가장 우선순위, 레벨 4가 최소의 우선순위이다. rejectValue에서 required를 호출 했을 때 required.item.itemName와 같이 상세한 코드가 있으면 그 코드를 우선순위로 불러오고, 그렇지 않다면 단계를 거쳐가며 낮은 단계의 코드를 불러온다.
만약 level 1, 3이 주석처리 되어있으면 웹 사이트에 상품명을 입력하지 않았을 시에 "필수 값 입니다."라는 문자를 출력해준다.
@PostMapping("/add") public String addItemV4(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) { if (!StringUtils.hasText(item.getItemName())) { bindingResult.rejectValue("itemName", "required"); if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) { bindingResult.rejectValue("price", "range", new Object[]{1000, 1000000}, null); } if (item.getQuantity() == null || item.getQuantity() > 10000) { bindingResult.rejectValue("quantity", "max", new Object[]{9999}, null); } // 특정 필드가 아닌 복합 룰 검증 if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice < 10000) { bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null); } } // 검증에 실패하면 다시 입력 폼으로 이동하는 로직 if (bindingResult.hasErrors()) { log.info("errors = {}", bindingResult); // model.addAttribute("errors", 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}"; }
전체 코드인데 차이점은 rejectValue를 사용했다는 것이다. 필드가 아닌 Object 에러 메시지는 reject를 사용하면 된다.
'스프링 > 스프링 MVC 패턴' 카테고리의 다른 글
스프링 자동 검증기(Bean Validation) (0) 2023.02.25 Validation 분리 (0) 2023.02.23 상품 등록 범위 검증 - V2 (BindingResult) (0) 2023.02.23 상품 등록 범위 검증 - V1 (0) 2023.02.22 셀렉트 박스 (배송 방식 : 빠른 배송, 일반 배송, 느린 배송) (0) 2023.02.19