Validator 분리하기 / Bean Validation

Validator 분리하기 / Bean Validation

ItemValidator 클래스를 미리 만들어 컴포넌트로 스프링 컨테이너에 등록하고 컨트롤러에서 사용하는 방법으로 Validator를 분리할 수 있다.

사실 검증은 값이 비어있는지, 혹은 원하는 타입이나 폼에 맞는지 등 논리적으로는 간단한 과정이나 이전 Validator를 사용하는 방식에서는 과하게 복잡한 코드를 직접 짜야하는 비효율적인 과정을 거쳐야 했다. 그러나 Bean Validation을 사용하면 이런 과정을 크게 줄일 수 있다. 다음 도메인 코드를 보자.

@NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull @Max(9999) private Integer quantity;

@NotBlank, @NotNull, @Range 등이 모두 BeanValidation의 어노테이션이다. 앞서 구현했던 복잡한 코드들을 이렇게 간단하게 어노테이션으로 설정할 수 있다. 이렇게 설정된 도메인 폼에 들어오는 데이터가 검증에 실패하면 자동으로 bindingResult 객체에 에러를 넣어준다.

@PostMapping("/add") public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) { if (bindingResult.hasErrors()) { log.info("errors={}", bindingResult); return "validation/v3/addForm"; }

도메인 자체의 복합 룰 오브젝트 검증은 어떻게 수행할까? 다음 도메인 코드를 보자.

@Data @ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000") public class Item { //... }

위 도메인 클래스에 @ScriptAssert 어노테이션을 설정해두면 해당 클래스의 price와 quantity 의 곱이 10000이 넘지 않으면 오류 메시지를 출력하도록 설정한다.

from http://sbed307.tistory.com/21 by ccl(A) rewrite - 2021-11-21 15:28:12