-
스프링 자동 검증기(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 애노테이션을 넣어주면 된다. 하지만 실제 사용할 때는 제약이 많고 복잡하기때문에 예전에 했던 그대로 자바 코드로 작성하는 것을 추천한다고 한다.
'스프링 > 스프링 MVC 패턴' 카테고리의 다른 글
등록과 수정의 검증 분리 - V4 (0) 2023.02.25 상품 수정 검증, 검증 groups - V3 (0) 2023.02.25 Validation 분리 (0) 2023.02.23 오류 코드와 메시지 처리 (0) 2023.02.23 상품 등록 범위 검증 - V2 (BindingResult) (0) 2023.02.23