스프링/4. 스프링 MVC-2

36. 검증로직 분리 2

sdafdq 2023. 9. 2. 22:41

컨트롤러의 로직에서 따로 관리할 수 있다.

 

@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