Bean Validation이란?
회원가입 등 특정 필드에 대한 검증 로직을 모든 프로젝트에 적용할 수 있도록 표준화 한 것으로,
애너테이션을 사용하여 쉽게 검증 기능을 구현할 수 있다.
여기에서 다양한 검증 애너테이션의 종류와 설명을 볼 수 있다.
Bean Validation 사용 방법
1. 의존관계 추가
Bean Validation을 사용하려면 우선 build.gradle에 의존관계를 추가해야 한다.
추가 후 refresh하는 것도 잊지 않도록 한다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 적용
의존관계를 추가하면 @NotNull, @Range 등 검증과 관련된 애너테이션을 사용할 수 있다.
테스트용으로 Validation이라는 클래스를 다음과 같이 작성했다.
public class Validation {
@NotNull
@Min(1)
private Integer minVal;
@Max(100)
private Integer maxVal;
@Range(min = 10, max = 100)
private Integer rangeVal;
}
검증할 데이터가 들어오는 쪽에서 @Validated와 @BindingResult를 통해 검증 및 검증 오류 결과를 확인할 수 있다.
@Slf4j
@RestController
public class ValidationController {
@GetMapping("/test")
public String setValues(@Validated @ModelAttribute Validation validation, BindingResult bindingResult) {
log.info("validation={}", validation);
if (bindingResult.hasErrors()) {
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
log.info("errorMessage={}", fieldError.getDefaultMessage());
}
}
return "OK";
}
}
@Validated를 검증할 데이터 앞에, @BindingResult를 검증할 데이터 뒤에 써야 한다.
또한 @Validated(스프링 전용) 대신 @Valid(자바 표준)를 사용해도 된다.
Validation 객체의 필드값을 임의로 입력하여 로그를 확인해보면 아래와 같다.
validation=Validation(minVal=0, maxVal=5, rangeVal=1)
errorMessage=1 이상이어야 합니다
errorMessage=10에서 100 사이여야 합니다
이렇듯 오류 메시지를 확인해보면 Bean Validation이 기본으로 제공하는 메시지가 나오는데, 이 메시지는 직접 변경할 수 있다.
3. 오류 메시지 설정
3-1. 애너테이션별로 message 값을 주어 각 필드에 오류 메시지를 지정할 수 있다.
@NotNull(message = "값 필수 입력!")
@Min(1)
private Integer minVal;
3-2. errors.properties 파일을 만들어 오류 메시지를 지정할 수 있다.
이 경우 application.properties에 설정 파일을 등록해야 한다.
spring.messages.basename=messages,errors
이 코드가 없으면 디폴트로 spring.messages.basename=messages가 적용되어 있으니 참고하자.
errors.properties 파일의 경로는 application.properties와 동일하게
src/main/resources/errors.properties 로 해야 한다.
#스프링이 생성한 기본 오류 메시지 설정하기
typeMismatch.java.lang.Integer = 숫자를 입력하세요!
typeMismatch = 타입 오류입니다!
#Bean Validation 오류 메시지 설정하기
NotNull.validation.minVal = 값을 입력하세요!
NotNull={0} Null 안됨!!!!
Range={0}, {2} ~ {1}의 값만 가능합니다!
Max={0}, 최대 {1}까지 입력할 수 있습니다!
메시지는 해당되는 설정 중 디테일한 설정을 우선순위로 하여 적용된다.
👉🏻 여기서 NotNull의 경우 NotNull.validation.minVal이 우선적으로 적용
3-3. 메시지 생성 규칙
아래 예시에서 숫자가 낮을수록 우선순위가 높다.
1. code + "." + object name
2. code
ex) 오류 코드: required, object name: item
1. required.item
2. required
1. code + "." + object name + "." + field
2. code + "." + field
3. code + "." + field type
4. code
ex) 오류 코드: typeMismatch, object name "user", field "age", field type: int
1. "typeMismatch.user.age"
2. "typeMismatch.age"
3. "typeMismatch.int"
4. "typeMismatch"
검증 애너테이션의 종류
다양한 검증 애너테이션이 있지만, 자주 쓰이는 몇가지를 살펴보면 다음과 같다.
@NotNull
Null을 허용하지 않음. "" 또는 " "는 허용함
@NotEmpty
Null과 ""을 허용하지 않음. " "는 허용함
@NotBlank
Null, "", " " 모두 허용하지 않음
@Range
@Range(min = 1000, max = 100000)
private Integer price;
@Max(n)
최댓값 지정. n 이하의 값만 허용함
@Max(9999)
private Integer quantity;
@Min(n)
최솟값 지정. n 이상의 값만 허용함
@Min(1)
private Integer quantity;
참고