ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - Validator 분리와 구현
    Spring/Spring MVC 2022. 2. 6. 17:22
    반응형

     

     

     

     

    Validator 분리와 구현

     검증을 컨트롤러에 구현하면 컨트롤러가 처리하는 로직을 찾기도 어려울 뿐만 아니라 컨트롤러에 너무 많은 부담을 준다. 때문에 검증 처리 부분은 따로 분기해서 사용하는 것이 좋은데 스프링에서 검증 처리를 분기해주는 Validator 인터페이스를 제공한다.

     

     

    Validator를 상속받는 클래스 구현과 사용 방법

    • Validator 인터페이스를 상속받는 클래스 구현하여 빈 등록을 해준다.
    • 컨트롤러에 작성한 검증 처리를 해당 클래스로 분기할 수 있다.
    • 분기한 검증 처리(검증기)를 사용하기 위해선 해당 컨트롤러에 주입을 받고
      @InitBinder를 통해 검증기에 WebDataBinder를 추가해줘야 한다.
    • 검증이 필요한 검증 객체에 @Validated를 적용해주면 된다.

     

    검증 처리를 위한 클래스 생성

     

    itemValidator

    @Component
    public class ItemValidator implements Validator {
    
        @Override
        public boolean supports(Class<?> clazz) {
            return Item.class.isAssignableFrom(clazz);
        }
    
        @Override
        public void validate(Object target, Errors errors) {
            Item item = (Item) target;
    
            if (!StringUtils.hasText(item.getItemName())) {
                errors.rejectValue("itemName", "required");
            }
            if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
                errors.rejectValue("price", "range", new Object[]{1000, 10000000}, null);
            }
            if (item.getQuantity() == null || item.getQuantity() >= 9999) {
                errors.rejectValue("quantity", "max", new Object[]{9999}, null);
            }
    
            //특정 필드가 아닌 복합 룰 검증
            if (item.getPrice() != null && item.getQuantity() != null) {
                int resultPrice = item.getPrice() * item.getQuantity();
                if (resultPrice < 10000) {
                    errors.reject("totalPriceMin", new Object[]{10000, resultPrice}, null);
                }
            }
        }
    }

    ▶ @Component : 빈 등록

    public boolean supports(Class<?> clazz)
              - 검증 객체가 해당 검증기를 찾게 해주는 메서드
              - 검증기에서 검증하는 객체가 맞으면 true, 아니면 false를 반환
              - 객체의 자손들도 true를 반환해준다.
    public void validate(Object target, Errors errors)
              - target : 검증 객체 
              - errors : 에러 객체 (BindingResult)


     

    컨트롤러에 검증기 주입

     

    • 컨트롤러에서 검증기를 사용하기 위해서는 빈으로 등록된 검증기를 주입을 받아서 사용해야 한다.

     

    @Slf4j
    @Controller
    @RequestMapping("/validation/v2/items")
    @RequiredArgsConstructor
    public class ValidationItemControllerV2 {
    
        private final ItemValidator itemValidator;
        
        ....

    @RequiredArgsConstructor
             - lombok을 이용하여 생성자 주입


     

    WebDataBinder를 통해 검증기 사용

     

    • 컨트롤러에 주입받은 검증기를 직접 사용할 수 있지만 더 편리하게 사용하기 위해 사용하는 클래스
    • @Validated가 붙은 검증 객체는 해당 검증기를 찾아 검증 처리를 할 수 있다.
    • 검증기는 supports(Class clazz) 메서드를 통해 찾을 수 있다.

     

    @Slf4j
    @Controller
    @RequestMapping("/validation/v2/items")
    @RequiredArgsConstructor
    public class ValidationItemControllerV2 {
    
    	....
    
        @InitBinder
        public void init(WebDataBinder dataBinder) {
            log.info("init binder {}", dataBinder);
            dataBinder.addValidators(itemValidator);
        }
        
        ....
        
        public String addItemV6(@Validated @ModelAttribute Item item, ....
        
        
        ....

     

     

     

     

     

     

    반응형

    댓글

Designed by Tistory.