ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오류 코드와 메시지 처리
    스프링/스프링 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를 사용하면 된다.

Designed by Tistory.