Study/spring

[Java] Spring Boot 3 @Valid 어노테이션 사용 예제

 

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

valid 적용 전 컨트롤러 실행(param)
valid 적용 전 컨트롤러 실행(param)
valid 적용 전 컨트롤러 실행(Request Body)
valid 적용 전 컨트롤러 실행(Request Body)

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 객체 유효성 검사 결과입니다.

 

제약조건을 건 상태로 요청을 보내보면 다음과 같은 결과가 나옵니다.

Valid 적용 후 컨트롤러 실행 결과(Param)
Valid 적용 후 컨트롤러 실행 결과(Param)

 

이전에 보낸 요청과 같은 요청을 보냈는데 이번에는 오류가 발생했습니다.

 

name에 해당하는 값이 없어서 @NotEmpty 조건에 의해 유효성 검사가 통과되지 못해서 발생한 오류입니다.

오류 메시지에도 "공백일 수 없습니다"라고 표시됩니다.

 

제약 조건을 통과했을 때 결과(Param)
제약 조건을 통과했을 때 결과(Param)

@NotEmpty 조건은 이 어노테이션이 붙은 변수의 값이 null이거나 빈 문자열이 아니면 통과합니다.

 

다른 제약 조건 역시 마찬가지입니다.

@Min 제약 조건을 통과하지 못했을 때(Param)
@Min 제약 조건을 통과하지 못했을 때(Param)

@Min(10) 제약 조건이 걸려있기 때문에 이 값이 10보다 작으면 유효성 검사를 통과하지 못합니다.

최소값 조건을 맞춰주면 유효성 검사를 통과할 수 있습니다.

 

@Min 제약 조건을 통과했을 때(Param)
@Min 제약 조건을 통과했을 때(Param)

Param 객체에 걸린 유효성 검사를 통과하였습니다.

 

 

RequestBody 검증

@RequestBody 객체를 검증했을 때의 결과입니다.

 

Param 방식과 동일하게 각 조건에 맞지 않으면 오류가 발생합니다.

@NotEmpty 조건을 통과하지 못했을 때(RequestBody)
@NotEmpty 조건을 통과하지 못했을 때(RequestBody)

 

Param 방식처럼 @NotEmpty 어노테이션이 붙은 변수에 값이 없을 때 오류가 발생하였습니다.

 

걸려있는 제약조건을 통과하지 못했을 때는 통과하지 못한 조건에 대한 오류가 모두 반환됩니다.

@NotEmpty, @Min 조건을 통과하지 못했을 때(RequestBody)
@NotEmpty, @Min 조건을 통과하지 못했을 때(RequestBody)

제약 조건이 2개가 걸려있었는데, 2개 다 통과하지 못하면 오류 카운트 2개와 2개에 대한 코드 및 오류메시지가 반환됩니다.

 

RequestBody 객체 유효성 검사 통과
RequestBody 객체 유효성 검사 통과

RequestBody 객체의 유효성 검사를 모두 통과하면 정상적으로 요청 결과 값이 반환됩니다.

 

 

읽으면 좋은 글

[Java] Spring boot 3 @NotNull @NotEmpty @NotBlank 차이 비교

 

[Java] Spring boot 3 @NotNull @NotEmpty @NotBlank 차이 비교

@NotNull, @NotEmpty, @NotBlank 어노테이션은 Spring에서 유효성 검사할 때 많이 사용하는 어노테이션입니다.세 어노테이션의 차이와 용도에 대해 정리해보았습니다. 준비import java.util.List;import org.springfr

priming.tistory.com

[Java] Spring Boot 3 Validation @Pattern 정규식 예제

 

[Java] Spring Boot 3 Validation @Pattern 정규식 예제

@Pattern 어노테이션은 요청 값이 정규표현식에 맞는 문자열인지 검증하는 어노테이션입니다. 예제 코드숫자, 알파벳, 한글, 이메일, 전화번호, 비밀번호, 시작 문자, 끝 문자, 포함 문자, 제외 문

priming.tistory.com

[Java] Spring Boot 3 @Valid ExceptionHandler 예외 처리 방법

 

[Java] Spring Boot 3 @Valid ExceptionHandler 예외 처리 방법

@Valid를 사용하여 요청값을 검증할 때 검증을 통과하지 못하면 응답값이 너무 많이 나오는 문제가 있습니다.요청 값 유효성 검사를 통과하지 못했을 때 예외 처리하는 방법을 설명드리겠습니다.

priming.tistory.com