검증 기능을 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은
대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다.
Bean Validation이란?
Bean Validation 2.0이라는 기술 표준. 검증 애노테이션과 여러 인터페이스의 모음. 일반적으로 사용하는 구현체는 하이버네이트 Validator이다.
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;
//...
}
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute Item item, BindingResult
bindingResult, RedirectAttributes redirectAttributes)
스프링 부트는 LocalValidatorFactoryBean을 글로벌 Validator로 등록한다. 이 Validator는 @NotNull같은 애노테이션을 보고 검증을 수행한다. 이렇게 글로벌 Validator 가 적용되어 있기 때문에, @Valid, @Validated만 적용하면 된다.
@Validated 는 스프링 전용 검증 애노테이션이고, @Valid 는 자바 표준 검증 애노테이션이다. @Validated 는 내부에 groups 라는 기능을 포함하고 있다.
검증 오류가 발생하면, FieldError, ObjecError를 생성해서 BindingResult에 담아준다.
@NotNull: null 허용 안함
@NotEmpty: null과 공백값("")을 허용 안함
@NotBlank: null과 빈값(" ")을 허용 안함
@Max: 최대 값 설정
@Range: 범위 값 설정
@Email: 이메일 형식
message 속성: 에러 메시지를 커스텀 할 수 있다
기본으로 제공하는 오류 메시지를 좀 더 자세히 변경하고 싶을 때는 어떻게 하면 될까?
Bean Validation을 적용하고 bindingResult에 등록된 검증 오류 코드
[@NotBlank]
NotBlank.item.itemName
NotBlank.itemName
NotBlank.java.lang.String
NotBlank
메시지 등록
[errors.properties]
NotBlank={0} 공백X
Range={0}, {2} ~ {1} 허용
Max={0}, 최대 {1}
Bean Validation 메시지 찾는 순서