✏️ Controller 전체에 검증 로직 작동시키기
📍 WebDataBinder (검증기) 적용
@InitBinder
- 해당 Controller 로 url 이 매핑되면 어노테이션이 선언된 method 가 실행된다.
- Spring 내부적으로 생성된
WebDataBinder
를 매개변수로 받아서 Controller 의 매핑 method 가 실행되기전 검증을 수행 해준다.
@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);
}
📍 Validated 적용
🔗 Validator
- 객체에
@Validated
어노테이션을 붙여주면 V2.7 에서 사용한 ItemValidator.validate
를 호출해주지 않아도 된다.
- 위에서 생성한
@InitBinder
method 에서 ItemValidator.supports
로 검증할 수 있는 객체를 판별하고 검증 가능한 로직으로 검증을 대신 수행해준다.
@PostMapping("/add")
public String addItemV6(
@Validated @ModelAttribute Item item,
BindingResult bindingResult,
RedirectAttributes redirectAttributes
) {
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}";
}
✏️ 모든 Controller 에 대해 검증 적용
- 현재 Controller 를 넘어 글로벌로 검증을 적용시키는 방법도 있다.
- 글로벌로 선언할 경우 Controller 내의
WebDataBinder
method 는 구현하지 않아도 된다.
- ⚠️ 글로벌 설정은
BeanValidator
가 자동 등록되지 않기때문에 잘 사용하지 않는 기능이다.