Spring Boot 3 버전에서 @Valid 어노테이션을 사용해서 객체를 검증하는 방법입니다.
ModelAttribute(Param)과 RequestBody 객체 2가지 방식을 예시로 설명하겠습니다.
Valid 사용 전 준비
Valid 사용을 위해 라이브러리를 추가합니다.
# pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
# build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
spring-boot-starter-validation 라이브러리를 추가합니다.
어노테이션 사용을 위한 컨트롤러입니다.
우선은 어떠한 제약조건도 걸지 않은 상태입니다.
참고로 Spring Boot 3 버전이기 때문에 jakarta.validation 패키지의 Valid 어노테이션이 사용되었습니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import lombok.Getter;
@RestController
public class ValidController {
@GetMapping("/valid/param")
public ValidObject checkParam(@Valid ValidObject object) {
return object;
}
@PostMapping("/valid/body")
public ValidObject checkRequestBody(@Valid @RequestBody ValidObject object) {
return object;
}
@Getter
@AllArgsConstructor
public class ValidObject {
private String name;
private Integer number;
}
}
Param 방식과 RequestBody 방식으로 객체를 받아서 그대로 반환하는 API 2개를 만들었습니다.
@Valid 어노테이션이 객체에 붙어있는데, 이 어노테이션이 없으면 유효성 검사를 하지 않습니다.
Param(ModelAttribute) 방식과 RequestBody 방식일 때 객체를 검증하는 방법에 대해 설명드리겠습니다.
제약 조건 추가
우선 다음과 같은 제약 조건을 추가합니다.
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
...
@Getter
@AllArgsConstructor
public static class ValidObject {
@NotBlank
private String name;
@Min(10)
private Integer number;
}
@NotBlank 제약 조건을 추가했습니다.
@NotBlank 어노테이션이 붙은 변수는 비어있는 경우에 유효성 검사를 통과하지 못합니다.
@Min 어노테이션은 최소값을 정해주는 조건입니다.
최소값을 10으로 설정했기 때문에 변수의 값이 10 미만이면 유효성 검사를 통과하지 못합니다.
Param 검증
param 객체 유효성 검사 결과입니다.
제약조건을 건 상태로 요청을 보내보면 다음과 같은 결과가 나옵니다.
이전에 보낸 요청과 같은 요청을 보냈는데 이번에는 오류가 발생했습니다.
name에 해당하는 값이 없어서 @NotEmpty 조건에 의해 유효성 검사가 통과되지 못해서 발생한 오류입니다.
오류 메시지에도 "공백일 수 없습니다"라고 표시됩니다.
@NotEmpty 조건은 이 어노테이션이 붙은 변수의 값이 null이거나 빈 문자열이 아니면 통과합니다.
다른 제약 조건 역시 마찬가지입니다.
@Min(10) 제약 조건이 걸려있기 때문에 이 값이 10보다 작으면 유효성 검사를 통과하지 못합니다.
최소값 조건을 맞춰주면 유효성 검사를 통과할 수 있습니다.
Param 객체에 걸린 유효성 검사를 통과하였습니다.
RequestBody 검증
@RequestBody 객체를 검증했을 때의 결과입니다.
Param 방식과 동일하게 각 조건에 맞지 않으면 오류가 발생합니다.
Param 방식처럼 @NotEmpty 어노테이션이 붙은 변수에 값이 없을 때 오류가 발생하였습니다.
걸려있는 제약조건을 통과하지 못했을 때는 통과하지 못한 조건에 대한 오류가 모두 반환됩니다.
제약 조건이 2개가 걸려있었는데, 2개 다 통과하지 못하면 오류 카운트 2개와 2개에 대한 코드 및 오류메시지가 반환됩니다.
RequestBody 객체의 유효성 검사를 모두 통과하면 정상적으로 요청 결과 값이 반환됩니다.
읽으면 좋은 글
[Java] Spring boot 3 @NotNull @NotEmpty @NotBlank 차이 비교
[Java] Spring Boot 3 Validation @Pattern 정규식 예제
[Java] Spring Boot 3 @Valid ExceptionHandler 예외 처리 방법