검증 2 - validation

김성지·2022년 5월 26일
0

스프링기초

목록 보기
9/13

Bean Validator

private final ItemValidator itemValidator;
@InitBinder
public void init(WebDataBinder dataBinder) {
 log.info("init binder {}", dataBinder);
 dataBinder.addValidators(itemValidator);
}

삭제해주기

스프링 MVC가 어떻게 Bean Validator를 사용할까

스프링 부트는 자동으로 글로벌 Validator로 등록한다.

검증 순서

  1. @ModelAttribute 각각의 필드에 타입 변환을 시도한다.
    1-1. 성공하면 다음으로
    1-2. 실패하면 typeMismatch로 fieldError에 추가됨 (bindingResult에...)
    2.Validator 적용

MessageCodesResolver가 또 알아서 메시지 코드를 생성해준다.

BeanValidation 메시지 찾는 순서
1. 생성된 메시지 코드 순서대로 messageSource에서 찾기
2. 애노테이션의 message 속성 사용 -> @NotBlank(message = "공백!{0}")
3. 라이브러리가 제공하는 기본 값 사용 -> 공백일 수 없습니다.

오브젝트 오류는 어떻게 처리하나요

객체자체에 문제가 있을 때 또는 필드 값들을 조합하여 validation을 해야 할 경우
@ScriptAssert()가 있는데 안씀 그냥

오브젝트 오류 관련 부분만 직접 자바 코드로 작성하는 것을 권장하고 있슴

음 @ModelAttribute 와 form submit 에 대해서 알아보기...

그 냥 HTTP body 에 있는거 객체와 매핑 시켜주는거임
또는 Url 쿼리 스트링

상품 수정에도 적용 해보자

일단 똑같애 해줫음

Bean Validation의 한계

데이터를 등록할 때와 수정할 때는 요구사항이 다를 수 있다.

그냥 item 에 있는 어노테이션 수정하면 안됨

BeanValidation groups 기능을 사용해보자

잘안쓴다 패스한다

Form 전송 객체 분리(DTO)

@PostMapping("/add")
 public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
 //특정 필드 예외가 아닌 전체 예외
 if (form.getPrice() != null && form.getQuantity() != null) {
 int resultPrice = form.getPrice() * form.getQuantity();
 if (resultPrice < 10000) {
 bindingResult.reject("totalPriceMin", new Object[]{10000,
resultPrice}, 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.save(item);
 redirectAttributes.addAttribute("itemId", savedItem.getId());
 redirectAttributes.addAttribute("status", true);
 return "redirect:/validation/v4/items/{itemId}";
 }

이런식으로 써준다

0개의 댓글