V2.8 WebDataBinder 와 Validated

알파로그·2023년 3월 27일
0

Spring MVC 활용 기술

목록 보기
42/42

✏️ 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;

    //-- spring param 바인딩 --//
    @InitBinder
    public void init(WebDataBinder dataBinder) {
        dataBinder.addValidators(itemValidator);
    }

📍 Validated 적용

🔗 Validator

  • 객체에 @Validated 어노테이션을 붙여주면 V2.7 에서 사용한 ItemValidator.validate 를 호출해주지 않아도 된다.
    • 위에서 생성한 @InitBinder method 에서 ItemValidator.supports 로 검증할 수 있는 객체를 판별하고 검증 가능한 로직으로 검증을 대신 수행해준다.
//-- validated 사용 --//
@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 가 자동 등록되지 않기때문에 잘 사용하지 않는 기능이다.
profile
잘못된 내용 PR 환영

0개의 댓글