Spring ‐ Bean Validation - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 Bean Validation
- Bean Validation을 사용하려면 아래와 같은 의존성을 추가해주면 된다.
implementation 'org.springframework.boot:spring-boot-starter-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도 적용되지 않는다.