//@PostMapping("/add")
public String saveItemV7(Item item, BindingResult bindingResult,
RedirectAttributes redirectAttributes) {
if(!StringUtils.hasText(item.getItemName())) {
bindingResult.addError(
//FieldError : feild 단위의 error는 spring에서 제공해주는 객체
new FieldError("item","itemName","상품이름은 필수입니다"));
}
if(item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() >1000000) {
bindingResult.addError(
new FieldError("item","price","가격은 1,000, ~1,000,000 까지 허용"));
}
if(item.getQuantity() == null || item.getQuantity() >10000) {
bindingResult.addError(
new FieldError("item","quantity","수량은 최대 9,999까지 허용"));
}
//검증에 실패한다면 다시 입력 폼
if(bindingResult.hasErrors()) {
System.out.println("errors : " + bindingResult);
return "basic/addForm";
}
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/items/"+ item.getId();
}
//@PostMapping("/add")
public String saveItemV8(Item item, BindingResult bindingResult,
RedirectAttributes redirectAttributes) {
if(!StringUtils.hasText(item.getItemName())) {
bindingResult.addError(
new FieldError("item","itemName", item.getItemName(),
false, null, null, "상품이름은 필수입니다"));
}
if(item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() >1000000) {
bindingResult.addError(
new FieldError("item","price",item.getPrice(),
true,null,null,"가격은 1,000, ~1,000,000 까지 허용"));
}
if(item.getQuantity() == null || item.getQuantity() >10000) {
bindingResult.addError(
new FieldError("item","quantity",item.getQuantity(),
false,null,null,"수량은 최대 9,999까지 허용"));
}
//검증에 실패한다면 다시 입력 폼
if(bindingResult.hasErrors()) {
System.out.println("errors : " + bindingResult);
return "basic/addForm";
}
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/items/"+ item.getId();
}
다음 두 코드는 컨트롤러단에서 검증을 확인하는 두 개의 다른 메서드이다.
✍️어떤 점에서 두 메서드는 차이가 있는가?
첫번째 메서드는 하드코딩이다. 에러 메시지를 일일이 하나하나 써줘야 하기에 유지보수에 있어 취약하다. 두번째 메서드는 에러 메시지를 코드 내에서 직접 문자열로 지정하지 않고, 메시지 코드를 사용한다. new FieldError("item", "itemName", item.getItemName(), false, null, null, "상품이름은 필수입니다") 코드만 봐도 에러 메시지를 null로 지정하고 있다.
<div>
<div>등록 지역</div>
<div th:each="region : ${regions}" class="form-check form-check-inline">
<input type="checkbox" th:field="*{regions}" th:value="${region.key}" class="form-check-input">
<label th:for="${#ids.prev('regions')}" th:text="${region.value}" class="form-check-label">서울</label>
</div>
addForm.html코드
<div>
<div>등록 지역</div>
<div th:each="region : ${regions}" class="form-check form-check-inline">
<input type="checkbox" th:field="${item.regions}" th:value="${region.key}" class="form-check-input" disabled>
<label th:for="${#ids.prev('regions')}" th:text="${region.value}" class="form-check-label">서울</label>
</div>
</div>
item.html코드
둘의 차이는 무엇이라고 보는가? item은 item이라는 모델 속성의 open을 사용하고 있다.