<aside> 📖 Validation
</aside>
BindingResult 에 FieldError , ObjectError 생성하여 오류 정보 담아 리턴
BindingResult 가 있으면 타입 오류 발생 시 400 오류 나지 않고 컨트롤러도 정상 호출됨BindingResult 없으면 타입 오류 발생 시 400 오류 발생, 오류 페이지로 이동FieldError 와 ObjectError 의 생성자 대신 rejectValues(), reject() 사용하여 검증 오류 처리errors.properties 메시지 파일로 별도 관리
Validator 인터페이스 구현하여 검증 로직 별도 분리
validate() 호출WebDataBinder + @Validated 통해 호출⇒ 최종 코드 정리
@InitBinder
public void init(WebDataBinder dataBinder) {
		dataBinder.addValidators(itemValidator);
}
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item
											, BindingResult bindingResult
											, RedirectAttributes redirectAttributes) {
		if (bindingResult.hasErrors()) {
				return "validation/v2/addForm";
		}
		//성공 로직
		Item savedItem = itemRepository.save(item);
		redirectAttributes.addAttribute("itemId", savedItem.getId());
		redirectAttributes.addAttribute("status", true);
		return "redirect:/validation/v2/items/{itemId}";
}
클라이언트 검증 : 조작 가능, 보안에 취약
서버 검증 : 즉각적인 고객 사용성 부족
→ 적절히 섞어서 사용하되 최종적으로 서버 검증 필수
(API 방식 사용 시 API 응답 결과에 검증 오류를 남겨줘야 함)
addITem() 수정 코드