Spring Validation은 Spring Framework에서 제공하는 입력값 검증 기능으로, 사용자의 입력값이 미리 정해진 조건에 부합하는지를 확인하는 데 사용됩니다.
이 기능은 Bean Validation 2.0(JSR-380) 스펙을 기반으로 작동하며, 대표적인 구현체는 Hibernate Validator입니다.
Spring Validation의 주요 목적은 다음과 같습니다:
| 항목 | 설명 |
|---|---|
@Valid | 어노테이션으로, Bean Validation을 수행합니다. 기본적인 검증만 가능하며, 그룹 검증은 불가합니다. |
@Validated | 어노테이션으로, AOP 기반이며 그룹 검증도 지원합니다. @Service, @Controller 어디서든 적용 가능. |
| 제약 어노테이션 | 검증 규칙을 정의하는 어노테이션들. 예: @NotNull, @Size, @Min, @Max, @Email 등 |
BindingResult | 검증 실패 시 오류 정보를 담는 객체로, 컨트롤러 메서드에서 @Valid나 @Validated 다음에 선언하여 사용해야 함 |
Validator 인터페이스 | 직접 검증 로직을 작성할 때 사용하는 인터페이스. Spring의 LocalValidatorFactoryBean이 기본 구현체로 등록됨 |
| Bean Validation | 자바 표준 검증 API로, javax.validation 패키지를 기반으로 정의된 스펙. Hibernate Validator가 대표 구현체입니다. |
Spring Validation은 다음과 같은 순서로 동작합니다:
검증 대상 객체에 어노테이션 추가
@NotNull, @Size, @Email 등 제약 조건을 선언합니다.@Valid 또는 @Validated를 선언합니다.public ResponseEntity<?> createUser(@Valid @RequestBody UserDto dto, BindingResult result) { ... }
Spring이 Validator를 통해 자동 검증 수행
LocalValidatorFactoryBean을 통해 Hibernate Validator가 동작하며, 선언된 제약 조건을 기준으로 DTO를 자동 검증합니다.검증 오류 발생 시 BindingResult에 에러 바인딩
BindingResult가 파라미터로 선언된 경우, 예외를 발생시키지 않고 오류 내용을 해당 객체에 저장합니다.MethodArgumentNotValidException 등의 예외가 발생합니다.오류 메시지를 기반으로 사용자 응답 처리
@RestControllerAdvice 등으로 글로벌 처리도 가능합니다.| 어노테이션 | 설명 |
|---|---|
@NotNull | 값이 null이 아니어야 함 |
@NotBlank | 문자열이 null이 아니고, 공백이 아니어야 함 |
@Size | 문자열, 컬렉션 등의 크기 제한 |
@Email | 이메일 형식 유효성 검사 |
@Pattern | 정규표현식을 통한 문자열 패턴 검사 |
@Min, @Max | 숫자 범위 제한 |
@Validated vs @Valid 차이| 항목 | @Valid | @Validated |
|---|---|---|
| 제공 위치 | javax.validation | org.springframework.validation |
| 그룹 검증 지원 | ❌ 지원하지 않음 | ✅ 그룹 검증 가능 (@Validated(groups=...)) |
| 대상 | 주로 Controller 파라미터 | Controller, Service, AOP 등 광범위 사용 가능 |
| 내부 처리 방식 | 직접 Bean Validation 호출 | Spring AOP 기반으로 처리됨 |
BindingResult는 검증 후의 결과를 담는 객체입니다.@Valid 또는 @Validated와 함께 사용하면 검증 실패 시 예외가 발생하지 않고, 오류 정보를 확인할 수 있습니다.public String submitForm(@Valid FormDto dto, BindingResult result) {
if (result.hasErrors()) {
return "formPage"; // 에러 있는 경우
}
return "redirect:/success";
}
@ControllerAdvice)Spring Validation 실패 시 전역적으로 일관된 에러 응답을 만들고 싶다면 @RestControllerAdvice와 함께 사용할 수 있습니다.
MethodArgumentNotValidException → DTO 검증 실패ConstraintViolationException → 파라미터 수준 검증 실패 (@RequestParam, @PathVariable 등)@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleValidation(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
for (FieldError error : ex.getBindingResult().getFieldErrors()) {
errors.put(error.getField(), error.getDefaultMessage());
}
return ResponseEntity.badRequest().body(errors);
}
}