Validation, BindingResult
검증(validation), BindingResult
Validation(검증)
- 클라이언트에서 서버로 값을 전달하고자 할 때 (
@RequestBody,@RequestParam,@PathVariable) 전달되는 데이터에 대해 유효성 검증을 수행하며 유효하지 않을 경우 에러
@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO) {
// 유효성 검사 통과 시 실행됨
return ResponseEntity.ok("Created");
}
Validation의 주요 기능
@Valid또는@Validated어노테이션을 사용하여 Spring이 요청 데이터를 자동으로 검사하게 할 수 있다.- 유효성 실팻히
MethodArgumentNotValidException이 발생하여 자동으로 400에러 응답을 줄 수 있다.
@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO) {
// 유효성 통과 후 로직 실행
return ResponseEntity.ok().build();
}
Validation 어노테이션
| 카테고리 | 주요 어노테이션 |
|---|---|
| 문자열 | @NotBlank, @Size, @Email, @Pattern |
| 숫자 | @Min, @Max, @Positive, @Digits |
| 날짜 | @Past, @Future, @PastOrPresent |
| 공통 | @NotNull, @NotEmpty, @Null |
문자열 관련 어노테이션
| 어노테이션 | 설명 |
|---|---|
@NotBlank |
공백이 아닌 문자열이어야 함 (null, “”, “ “ 모두 허용 안 됨) |
@NotEmpty |
null이 아니고 길이가 0 이상이어야 함 ("" 허용 안 됨, " "은 허용됨) |
@Size(min, max) |
문자열 또는 컬렉션의 길이가 min 이상, max 이하 |
@Pattern(regexp) |
정규표현식에 부합해야 함 |
@Email |
이메일 형식이어야 함 (기본적으로 RFC 5322 준수) |
숫자 관련 어노테이션
| 어노테이션 | 설명 |
|---|---|
@Min(value) |
지정된 값 이상 |
@Max(value) |
지정된 값 이하 |
@Positive |
0보다 커야 함 |
@PositiveOrZero |
0 또는 양수 |
@Negative |
0보다 작아야 함 |
@NegativeOrZero |
0 또는 음수 |
@Digits(integer, fraction) |
정수부와 소수부 자릿수 제한 |
Null 관련 어노테이션
| 어노테이션 | 설명 |
|---|---|
@NotNull |
null이 아니어야 함 (빈 문자열 ""은 허용) |
@Null |
반드시 null이어야 함 |
날짜 / 시간 관련 어노테이션
| 어노테이션 | 설명 |
|---|---|
@Past |
현재보다 과거 날짜 |
@PastOrPresent |
과거 또는 오늘 날짜 |
@Future |
현재보다 미래 날짜 |
@FutureOrPresent |
미래 또는 오늘 날짜 |
컬렉션 관련 어노테이션
@NotEmpty: 컬렉션, 배열, 맵 등에 적용 가능 (null 또는 빈 경우 유효하지 않음)@Size: 리스트/배열 등의 길이 제한
BindingResult
@BindingResult는 유효성 검사 결과를 담은 객체이다.@Valid나@Validated뒤에 바로 파라미터로 선언하면, 유효성 검사에서 오류가 발생해도 예외가 발생하지 않고 에러 정보를 이 객체를 통해직접 처리할 수 있다.
@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
// 유효성 오류 처리
return ResponseEntity.badRequest().body(bindingResult.getAllErrors());
}
// 유효성 검사 통과
return ResponseEntity.ok("Created");
}
- 중요한 규칙 :
@Valid또는@Validated뒤에 바로 위치한 파라미터여야 유효성 검사 결과가 BindingResult에 담깁니다.
Valid vs Validated 차이점
| 항목 | @Valid |
@Validated |
|---|---|---|
| 소속 | javax.validation (JSR-303) |
Spring Framework |
| 그룹 지정 | ❌ 안 됨 | ✅ 가능 (groups) |
| 실무 사용 | 일반적인 DTO 검사 | 그룹별 조건 검사 시 사용 |
요약
| 항목 | 설명 |
|---|---|
@Valid / @Validated |
DTO에 선언된 Bean Validation 애너테이션을 기준으로 유효성 검사 수행 |
BindingResult |
유효성 검사 결과(에러 포함)를 담고 있음. 예외를 막고 직접 오류 처리 가능 |
| 사용 순서 | 항상 @Valid 또는 @Validated 바로 뒤에 위치해야 함 |