Spring Validation

김현찬·2025년 6월 12일

Spring Validation이란?

Spring Validation은 Spring Framework에서 제공하는 입력값 검증 기능으로, 사용자의 입력값이 미리 정해진 조건에 부합하는지를 확인하는 데 사용됩니다.
이 기능은 Bean Validation 2.0(JSR-380) 스펙을 기반으로 작동하며, 대표적인 구현체는 Hibernate Validator입니다.


검증 기능의 목적

Spring Validation의 주요 목적은 다음과 같습니다:

  • 서비스 로직 보호: 잘못된 데이터가 핵심 로직에 도달하는 것을 방지합니다.
  • 사용자 응답 처리: 오류 발생 시 적절한 에러 메시지를 사용자에게 전달합니다.
  • 객체 무결성 보장: 엔터티나 DTO가 비정상적인 상태로 시스템에 유입되지 않도록 합니다.

주요 구성 요소 및 개념

항목설명
@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 동작 방식 (검증 흐름)

Spring Validation은 다음과 같은 순서로 동작합니다:

  1. 검증 대상 객체에 어노테이션 추가

    • DTO 클래스에 @NotNull, @Size, @Email 등 제약 조건을 선언합니다.
    • 컨트롤러 메서드 파라미터에 @Valid 또는 @Validated를 선언합니다.
    public ResponseEntity<?> createUser(@Valid @RequestBody UserDto dto, BindingResult result) { ... }
  2. Spring이 Validator를 통해 자동 검증 수행

    • LocalValidatorFactoryBean을 통해 Hibernate Validator가 동작하며, 선언된 제약 조건을 기준으로 DTO를 자동 검증합니다.
  3. 검증 오류 발생 시 BindingResult에 에러 바인딩

    • BindingResult가 파라미터로 선언된 경우, 예외를 발생시키지 않고 오류 내용을 해당 객체에 저장합니다.
    • 선언되지 않았다면, MethodArgumentNotValidException 등의 예외가 발생합니다.
  4. 오류 메시지를 기반으로 사용자 응답 처리

    • 오류 정보를 바탕으로 에러 응답을 생성하거나, 뷰로 다시 이동시킬 수 있습니다.
    • REST API인 경우 @RestControllerAdvice 등으로 글로벌 처리도 가능합니다.

자주 쓰는 제약 어노테이션

어노테이션설명
@NotNull값이 null이 아니어야 함
@NotBlank문자열이 null이 아니고, 공백이 아니어야 함
@Size문자열, 컬렉션 등의 크기 제한
@Email이메일 형식 유효성 검사
@Pattern정규표현식을 통한 문자열 패턴 검사
@Min, @Max숫자 범위 제한

@Validated vs @Valid 차이

항목@Valid@Validated
제공 위치javax.validationorg.springframework.validation
그룹 검증 지원❌ 지원하지 않음✅ 그룹 검증 가능 (@Validated(groups=...))
대상주로 Controller 파라미터Controller, Service, AOP 등 광범위 사용 가능
내부 처리 방식직접 Bean Validation 호출Spring AOP 기반으로 처리됨

BindingResult란?

  • 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);
    }
}

0개의 댓글