[Spring] Bean Validation

썸머·2022년 11월 8일
0

Bean Validation

검증 기능을 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은
대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다.

Bean Validation이란?
Bean Validation 2.0이라는 기술 표준. 검증 애노테이션과 여러 인터페이스의 모음. 일반적으로 사용하는 구현체는 하이버네이트 Validator이다.

Bean Validation - 스프링 적용

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 - 에러 코드

기본으로 제공하는 오류 메시지를 좀 더 자세히 변경하고 싶을 때는 어떻게 하면 될까?

  • 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 메시지 찾는 순서

  1. 생성된 메시지 코드 순서대로 messageSource에서 메시지 찾기
  2. 애노테이션의 message 속성 사용
  3. 라이브러리가 제공하는 기본 값 사용
profile
썸머의 개발블로그

0개의 댓글