인프런 커뮤니티 질문&답변

권정익님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

오류 코드와 메시지 처리3

상품 등록에서 상품명을 빈 칸으로 넣었을 때

해결된 질문

작성

·

129

0

html

<form action="item.html" th:action th:object="${item}" method="post">

 <label for="itemName" th:text="#{label.item.itemName}">상품명</label>
            <input type="text" id="itemName" th:field="*{itemName}"
                   th:errorclass="field-error" class="form-control" placeholder="이름을 입력하세요">
            <div class="field-error" th:errors="*{itemName}">
                상품명 오류
            </div>


controller
@PostMapping("/add")
    public String addItemV3(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {

        log.info("objectName={}", bindingResult.getObjectName());
        log.info("target={}", bindingResult.getTarget());

        //검증 로직
        if (!StringUtils.hasText(item.getItemName())) {
            bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false, new String[]{"required.item.itemName"}, null, null));
        }

        if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
            bindingResult.addError(new FieldError("item", "price", item.getPrice(), false, new String[]{"range.item.price"}, new Object[]{1000, 1000000}, null));
        }

        if (item.getQuantity() == null || item.getQuantity() >= 9999) {
            bindingResult.addError(new FieldError("item", "quantity", item.getQuantity(), false, new String[]{"max.item.quantity"}, new Object[]{9999}, null));
        }

        //특정 필드가 아닌 복합 룰 검증
        if (item.getPrice() != null && item.getQuantity() != null) {
            int resultPrice = item.getPrice() * item.getQuantity();
            if (resultPrice < 10000) {
                bindingResult.addError(new ObjectError("item", new String[]{"totalPriceMin"}, new Object[]{10000, resultPrice}, null));
            }
        }

        //검증에 실패하면 다시 입력 폼으로
        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}";
    }



log


2024-06-26T10:44:00.155+09:00  INFO 22592 --- [nio-8081-exec-8] h.i.w.v.ValidationItemControllerV2       : target=Item(id=null, itemName=, price=null, quantity=null)

상품 등록 창에서 전체 칸을 빈칸으로 넣어서 로그를 출력했을 때,

id, price, quantity는 null이 들어갔는데 itemName는 null이 아니라 그냥 빈칸인가요??

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

네, 맞습니다. itemName 필드에 대해 특별한 처리가 없다면 HTML 폼에서 빈칸으로 제출될 경우 해당 문자열은 null이 아니라 공백 문자열("")로 서버에 전송됩니다. 따라서 id, price, quantity 필드는 입력이 없을 때 null로 처리되지만 itemName은 빈 문자열로 처리되는 것입니다. 이는 HTML 폼 데이터가 처리되는 방식과 백엔드 서버에서의 데이터 처리 방식에 따른 것입니다. 서버 측에서 itemName이 빈 문자열로 넘어올 때 이를 null로 간주하거나 특정 로직을 적용하기 위해서는 추가적인 처리가 필요합니다.