컨트롤러의 로직에서 따로 관리할 수 있다.
@Slf4j
@Controller
@RequestMapping("/validation/v2/items")
@RequiredArgsConstructor
public class ValidationItemControllerV2 {
private final ItemRepository itemRepository;
private final ItemValidator itemValidator;
@InitBinder
public void init(WebDataBinder dataBinder){
dataBinder.addValidators(itemValidator);
}
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
//검증 오류 보관
if(bindingResult.hasErrors()){
log.info("errors = {}", bindingResult);
return "/validation/v2/addForm";
}
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v2/items/{itemId}";
}
}
@InitBinder
public void init(WebDataBinder dataBinder){
dataBinder.addValidators(itemValidator);
}
이렇게 해 두면, 만약에
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
//검증 오류 보관
if(bindingResult.hasErrors()){
log.info("errors = {}", bindingResult);
return "/validation/v2/addForm";
}
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v2/items/{itemId}";
}
이것처럼 검증할 객체 앞에 @Validated가 있다면
저 @InitBinder를 실행한다.
그럼 bindingResult나 item에 대한 처리를 한다.
WebDataBinder는 파라미터 바인딩 기능을 해주고 검증 기능도 내부에 포함되어 있다.
이게 뭐 자세히 설명하지는 않는다고 하신다.
굳이 자세히 설명할 필요는 없다고 하신다.
근데? 그냥 추측만 해보자 그러면.
검증에 대한 로직은 쨋든 dataBinder가 가지고 있는거다.
WebDataBinder가 item이나 Errors(bindingResult)를 가지고 있는 것 같지는 않은데,
요청하면 스프링에서 ItemValidator에서 validate 로직을 실행할 때 넣어주는 것 같다.
참고로 @Validated나 @Valid 둘 다 똑같이 동작된다.
근데 이건 축약어 그런 게 아니라
@Validated 는 스프링 꺼고,
@Valid는 자바 표준꺼다.
쓸 일은 없겠지만, 저
@InitBinder
public void init(WebDataBinder dataBinder){
dataBinder.addValidators(itemValidator);
}
이 부분을 웹서비스 전체에 제공할 수 있다.
@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Override
public Validator getValidator(){
return new ItemValidator();
}
}
이렇게 WebMvcConfigurer를 상속받고 override 해 두면 된다.
근데 쓸일은 없다. 이렇게 하면 Bean 검증기가 등록이 안되기 때문.
Bean으로써 관리할거다.
'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글
38. 빈 검증기 오류메시지 바꾸기 (0) | 2023.09.03 |
---|---|
37. 빈 검증 (0) | 2023.09.02 |
35. 검증로직 분리 (0) | 2023.09.02 |
34. 오류메시지 4 (0) | 2023.09.02 |
33. 오류메시지 3 (0) | 2023.09.02 |