👷 @Valid로 쉽게 구현하는 스프링 부트 유효성 검사
스프링 부트에서는 @Valid 어노테이션을 통해 유효성 검사를 쉽게 구현할 수 있다.
유효성 검사란?
사용자가 입력한 데이터가 올바르고 기대한 형식이나 조건에 맞는지 확인하는 과정을 의미한다. 이를 통해 잘못된 데이터가 시스템에 들어오는 것을 사전에 차단할 수 있다.
유효성 검사를 하지 않으면 예상치 못한 입력으로 인해 프로그램이 비정상 종료되거나 잘못된 데이터가 데이터베이스에 저장되어 오류가 발생할 수 있으며 보안 위험도 증가한다.
따라서 비즈니스 로직에 맞는 유효성 검사를 통해 올바른 데이터만 처리하고 잘못된 입력에 대해서는 사용자에게 적절한 피드백을 제공할 필요가 있다.
- Spring Boot 와 유효성 검사
스프링 부트에서는 @Valid 어노테이션을 사용해 객체의 유효성을 간단히 검사할 수 있다. 어노테이션을 사용하기 위해서는 먼저 Validation 관련 의존성을 프로젝트에 추가하여야 한다.
// build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
Jakarta Bean Validation API와 Hibernate Validator가 포함되어 있다.
의존성을 추가한 후에는 DTO에 유효성 검증 어노테이션을 붙인다.
public class PostCreateRequest {
@NotBlank(message = "제목은 필수입니다.")
@Size(max = 255, message = "제목은 255자 이내여야 합니다.")
private String title;
@NotBlank(message = "내용은 필수입니다.")
private String content;
@NotNull(message = "카테고리를 선택하여야 합니다.")
private Long categoryId;
@NotNull
private Boolean isPublic;
}
대표적으로 DTO에 붙일 수 있는 유효성 검사 어노테이션으로는 아래와 같은 것들이 있다.
1. @NotNull - null 값을 허용하지 않는다.
2. @NotBlank - null 및 빈 문자열(""), 공백만 있는 문자열(" ")을 모두 허용하지 않는다.
3. @NotEmpty - null 및 빈 값을 허용하지 않는다. (문자열, 배열, 리스트, 맵 모두 포함)
4. @Size - 길이 또는 크기를 제한한다.
5. @Pattern - 정규 표현식을 통해 문자열 패턴을 검증한다.
6. @Min, @Max - 숫자 타입의 최솟값, 최댓값을 지정한다.
각 필드의 타입에 따라 사용할 수 있는 어노테이션과 옵션들이 모두 다르기 때문에 데이터의 특성과 요구사항에 따라 적절하게 사용하는 것이 중요하다.
DTO에 유효성 검사 어노테이션을 설정한 후에는 실제로 이 검사가 작동하도록 하기 위해 컨트롤러에서 @Valid를 사용한다.
@PostMapping
public PostCreateResponse createPost(@Valid @RequestBody PostCreateRequest request) {
// ...컨트롤러 로직
}
*유효성 검사 실패 시 예외 처리
@Valid로 유효성 검사를 수행할 때 입력 값이 조건을 만족하지 못하면 두 가지 예외 중 하나가 발생할 수 있다.
@RequestBody로 전달된 DTO의 유효성 검사가 실패했을 때 발생하는 MethodArgumentNotValidException, @ModelAttribute 또는 @RequestParam 방식으로 전달된 데이터가 유효성 조건을 만족하지 못할 때 발생하는 BindException이 있다.
이를 처리하기 위해서는 컨트롤러에서 @Valid 바로 뒤에 BindingResult를 함께 선언하여 오류 정보를 수동으로 처리하거나 @RestControllerAdvice를 이용해 전역에서 공통적으로 예외를 처리하는 방식이 있다.