<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()
수정 코드