Spring - Validation - Validator분리 2
1. Spring Validator Interface
Spring에서 제공해주는 Validator를 사용하면 체계적인 검증 뿐만 아니라 Spring의 추가적인 도움도 받을 수 있다.
2.WebDataBinder 사용하기
@InitBinder
public void init(WebDataBinder dataBinder){
dataBinder.addValidators(itemValidator);
}
요청이 올 때 마다 새로 만들어지는 WebDataBinder에 기존에 만들었던 Validator(검증기)를 넣어주면 컨트롤러에서 요청이 될 때 마다 검증을 시도하게 된다.
cf) @InitBinder --> 해당 컨트롤러에만 영향을 준다. (글로벌 설정은 별도로 설정해야 한다.)
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item,
BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
// 검증에 실패하면 다시 입력 폼으로
if (bindingResult.hasErrors()) {
log.info("bindingResult = {}", 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 어노테이션만 추가 하면 WebDataBinder에 있는 검증기가 실행하고 그 실행 결과를 BindingResult에 담아 준다.
3. 동작 방식
@Validated는 검증기를 실행하라는 어노테이션이다.
이 어노테이션이 붙으면 'WebDataBinder'에 등록된 검증기를 찾아서 실행 한다.
--> 만약 여러 검증기를 등록했다면 그 중에 어떤 검증기가 실행되어야 할지 구분이 필요할텐데???
public boolean supports(Class<?> clazz) {} 함수를 통해 구분한다!!
supports() 함수를 호출해 결과가 true이면 검증기의 validate()가 실행된다.
4. 글로벌 설정 - 모든 컨트롤러에 다 적용
@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Override
public Validator getValidator(){
return new ItemValidator();
}
}
하지만 글로벌 설정을 하면 BeanValidator가 자동 등록 되지 않는다는 단점이 있다. 또한 글로벌 설정을 직접 사용하는 경우는 드물기 때문에 추천하지 않는다.
참고
검증시 @Validated @Valid 둘 다 사용가능하다.
@Valid를 사용하려면 build.gradle 의존 관계 추가가 필요하다.
@Validated는 스프링 전용 검증 어노테이션이고, @Valid는 자바 표준 검증 어노테이션이다.
출처 : 스프링 MVC 2편 - 백엔드 웹 개발 기술 활용
Author And Source
이 문제에 관하여(Spring - Validation - Validator분리 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyun6ik/Spring-Validation-Validator분리-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)