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편 - 백엔드 웹 개발 기술 활용

좋은 웹페이지 즐겨찾기