// bindingResult, Validated, SaveItemForm
우리가 사이트를 만들다 보면 회원가입이나 로그인 수정 등
유저가 직접 무언가를 폼 등에 작성해야하는 상황이 자연스럽게 나온다!
이때 유저가 폼 형식에 맞지 않거나 조건등에 부합하지 않게 적었을 경우!! => 오류를 검증해줄 필요가 있다!!
각각의 엔티티 내의 필드들을 검사할때 어노테이션만으로도 검사가 가능하다!
그렇게 하기 위해서는 설정과 사용방법을 알아야한다!
implementation 'org.springframework.boot:spring-boot-starter-validation'
만약에 객체가 아이디, 비밀번호, 생년월일, 이메일 등을 적어야한다면
로그인 할때는 아이디와 비밀번호에 대한 검증만 하면 되기 때문에 이걸 위한 클래스를 따로 만들다!!
@Data
public class ItemSaveForm {
@NotBlank
private String itemName;
@NotNull
@Range(min=1000, max=10000)
private Integer price;
@NotNull
@Max(9999)
private Integer quantity;
}
오류가 났을때 공통적인 이유로 나는 경우에 대해 각각 오류에 대한 메시지를 작성해준다.
totalPriceMin.item=상품의 가격*수량의 합은 {0}원이상이어야 함 / 현재 값 = {1}
NotBlank={0} 공백X
Range={0} {2}~{1} 허용
Max={0} 최대{1}
NotBlank부터 각각의 메시지의 {0}은 필드 이름이다 각각 itemName, price, quantity 가 된다!!
BindingResult는 검증 오류가 발생할 경우 오류 내용을 보관하는 스프링 프레임워크에서 제공하는 객체!
BindingResult는 무조건 @ModelAttribute가 붙은 객체 다음에 위치해야함!!
@PostMapping("/add")
public String addItem3(@Validated @ModelAttribute("item") ItemSaveForm form, BindingResult bindingResult,RedirectAttributes redirectAttributes ) {
// Object 오류 -> 즉 두개 이상의 필드와 관련된 오류일때는 Validated로 놔두기 보다는 이렇게 처리하기!
if(form.getPrice != null &&form.getQuantity != null) {
int result = form.getPrice() * form.getQuantity();
if (result < 10000) {
bindingResult.reject("totalPriceMin", new Object[] {10000, result}, null);
}
}
if(bindingResult.hasErrors()) {
log.info("errors={}", bindingResult);
return "validation/v4/addForm";
}
Item item = new Item();
item.setItemName(form.getItemName());
item.setPrice(form.getPrice());
item.setQuantity(form.getQuantity());
Item savedItem = itemRepository.(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v4/items/{itemId}";
}