ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 자동 검증기(Bean Validation)
    스프링/스프링 MVC 패턴 2023. 2. 25. 16:38

    검증을 일일이 개발자가 코딩을 하는 방법은 매우 비효율적이기에 스프링은 LocalValidatorFactoryBean이라는 글로벌 Validator로 등록된다.

     

    @Data
    public class Item {
    
        private Long id;
    
        @NotBlank
        private String itemName;
    
        @NotNull
        @Range(min = 1000, max = 1000000)
        private Integer price;
    
        @NotNull
        @Max(9999)
        private Integer quantity;

    Item 객체에 애노테이션들을 넣어주면 우리가 이전까지 했던 모든 검증을 스프링에서 자동으로 해준다.

     

    우리가 이전 게시글에서 엄청 길게 작성된 코드들이 간편하게 애노테이션 몇 개로 줄여질 수 있다.

     

     

    implementation 'org.springframework.boot:spring-boot-starter-validation'

     

    스프링 빈 자동 검증은 build.gradle에 위의 코드도 implement 해줘야한다.

     

    @PostMapping("/add")
    public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
        // @Validated가 검증을 알아서 해주고 bindingResult에 결과를 담아준다.
    
        // 검증에 실패하면 다시 입력 폼으로 이동하는 로직
        if (bindingResult.hasErrors()) {
            log.info("errors = {}", bindingResult);
            // model.addAttribute("errors", errors); // bindingResult가 자동으로 모델에 넘어가서 생략해도 됨
            return "validation/v3/addForm";
        }
        // 아래는 에러가 없을 때의 성공 로직
    
    
        Item savedItem = itemRepository.save(item);
        redirectAttributes.addAttribute("itemId", savedItem.getId());
        redirectAttributes.addAttribute("status", true);
        return "redirect:/validation/v3/items/{itemId}";
    }

    또한, 검증을 사용하기 위해 꼭 넣어줘야 하는것이 있는데, addItem의 파라미터에 @Validated을 무조건 넣어줘야한다.

     

     

     

     

    errors.properties

    #Bean Validation 추가
    NotBlank={0} 공백X 
    Range={0}, {2} ~ {1} 허용
    Max={0}, 최대 {1}

    errors.properties에 위와 같은 코드를 추가하면 에러가 났을 때 사용자에게 보여지는 메세지를 수정할 수 있다.

    {0}은 객체의 변수를 출력해준다

    상품명 입력을 안하면 'itemName 공백x'라는 문장이 사용자에게 보여진다.

     

     

     

     

     

     

     

    위와 같은 오류들은 필드에 들어가게 된다. 오브젝트 오류같은 경우에는 @ScriptAssert 애노테이션을 사용하면 된다.

    @Data
    @ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000")
    public class Item {
    
        private Long id;
    
        @NotBlank
        private String itemName;
    
        @NotNull
        @Range(min = 1000, max = 1000000)
        private Integer price;
    
        @NotNull
        @Max(9999)
        private Integer quantity;
    
        public Item() {
        }

    Item 객체 클래스 위에 @ScriptAssert 애노테이션을 넣어주면 된다. 하지만 실제 사용할 때는 제약이 많고 복잡하기때문에 예전에 했던 그대로 자바 코드로 작성하는 것을 추천한다고 한다.

     

Designed by Tistory.