해결된 질문
작성
·
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
로 간주하거나 특정 로직을 적용하기 위해서는 추가적인 처리가 필요합니다.