Spring ‐ Bean Validation - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 Bean Validation

  • Bean Validation을 사용하려면 아래와 같은 의존성을 추가해주면 된다.
implementation 'org.springframework.boot:spring-boot-starter-validation'

Spring - Bean Validation

@Data
public class ItemUpdateForm {

    @NotNull
    private Long id;

    @NotBlank(message = "빈값이 들어올 수 없습니다.")
    private String itemName;

    @NotNull
    @Range(min = 1000, max = 1000000)
    private Integer price;
}
// Validator를 별도로 분리하지 않고 컨트롤러에서 검증하고자 하는 인자에 @Validated 어노테이션을 붙여준다.
public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult) {
...
}

@Validated, @Valid 둘 다 사용 가능하다.@Validated 어노테이션은 스프링 전용 검증 어노테이션이고, @Valid 어노테이션은 자바 표준 어노테이션이다. 둘 중 아무거나 사용해도 동일하게 동작하나 @Validated 어노테이션은 내부에서 groups라는 기능을 포함한다.

  • 실제로 검증이 이루어지는 순서
    • @ModelAttribute 어노테이션이 붙은 인자에 대한 각각의 필드에 타입 변환 시도
      • 성공 시에만 Bean Validation 적용
      • 실패 시에는 typeMismatch로 BindingResult에 FieldError 추가되고 Bean Validation이 동작되지 않는다.

❗Bean Validation은 특정 필드에 대해서 예외를 발생시키는 FieldError에는 적합하나 해당 오브젝트 관련 오류 즉, ObjectError의 경우에는 제약이 많고 사용하기 복잡하다. ❗따라서 복합 필드의 에러인 경우라면 Validator를 등록해서 처리해야 한다.

📚 HTTP 메시지 컨버터

  • @Valid, @Validated 어노테이션은 HttpMessageConverter에도 적용할 수 있다.
  • @ModelAttribute: HTTP 요청 파라미터를 다룰 때 사용한다.
  • @RequestBody: HTTP Body 데이터를 객체로 변환할 때 사용한다.

@ModelAttribute 어노테이션의 경우 필드 단위로 정교한 바인딩이 이루어진다. 그래서 특정 필드에 타입이 맞지 않는 오류가 발생하더라도 나머지 필드는 정상 처리될 수 있다. ❗@RequestBody 어노테이션의 경우 JSON 데이터를 객체로 변환하지 못하면 이후 단계 자체가 진행되지 않고 예외가 발생한다. 결국 컨트롤러가 호출되지 않고 Validator도 적용되지 않는다.