suyeonme

[Spring] @Valid로 객체의 유효성 검사하기 본문

프로그래밍👩🏻‍💻/Spring

[Spring] @Valid로 객체의 유효성 검사하기

suyeonme 2023. 1. 9. 22:06

 @Valid, @Validated


javax.validation 패키지에 있는 @Valid 어노테이션을 사용하여 @RequestBody 객체의 유효성을 검사할 수 있다.

 

스프링부트 2.3버전 이상의 버전에서는 spring-boot-starter-web 의존성이였던 validation이 제거되었다. 따라서 직접 의존성을 추가해주어야한다.

// build.gradle
dependencies {
 //...
 implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation'
}

@Valid

  • javax.validation 패키지에 속하는 어노테이션으로 JSR-303 자바 표준 스펙이다.
  • Controller의 메소드에 대한 유효성을 검증한다. (ArgumentResolver를 통해 진행)
  • 유효성 검증에 실패할 경우, MethodArgumentNotValidException 예외가 발생한다.
// Controller
@PostMapping
public ResponseEntity<UserResponse> createUser(@Valid @RequestBody UserRequest userRequest) {
  // ...
  return new ResponseEntity<UserResponse>(user, HttpStatus.OK);
}

// UserRequest 객체
@Getter @Setter
public class UserDetailRequest {
    @NotNull(message = "Firstname cannot be null.")
    private String firstName;

    @NotNull(message = "Lastname cannot be null.")
    private String lastName;

    @NotNull(message = "Email cannot be null.")
    @Email
    private String email;

    @NotNull(message = "Password cannot be null.")
    @Size(min = 8, max = 16, message = "Password must be equal or grater than 8 characters and less than 16 characters.")
    private String password;
}

@Validated

  • org.springframework.validation.annotation에 속하는 어노테이션으로, 스프링 프레임워크에서 제공한다.
  • @Valid의 기능을 포함하며 추가적으로 유효성을 검사할 옵션에 대한 그룹을 지정할 수 있다.
  • AOP(Aspect Oriented Programming)를 기반으로 메서드의 요청을 가로채서 유효성 검사를 한다. 스프링 빈의 유효성 검증을 위해 사용되며 클래스에는 @Validated를, 메소드에는 @Valid를 붙여주어야 한다.
  • 유효성 검증에 실패할 경우, ConstraintViolationException 예외가 발생한다.
@Service
@Validated
public class UserService {
  public void createUser(@Valid UserRequest user) {
    //...
  }
}

유효성 검사 어노테이션  종류


유효성 검사를 위한 javax.constraint의 어노테이션 목록이다.

어노테이션 종류 설명 예시
@NotBlank String null이 아니며 공백이 아닌 문자를 하나 이상 포함한다.  
@NotEmpty String null 이거나 빈 문자열이 아니어야 한다.  
@NotNull 모두 null이 아닌 값이다.  
@Null 모두 null값이다.  
@Max int 해당값보다 작거나 같아야한다. @Max(value = 100)
@Min int 해당값보다 크거나 같아야한다. @Max(value = 1)
@DecimalMax String 해당값보다 작거나 같아야한다. @DecimalMax(value = "100")
@DecimalMin String 해당값보다 크거나 같아야한다. @DecimalMin(value = "1")
@Positive int 양수인 값이다.  
@PositiveOrZero int 0이거나 양수인 값이다.  
@Negative int 음수인 값이다.  
@NegativeOrZero int 0이거나 음수인 값이다.  
@Email String 올바른 형식의 이메일 주소여야한다.  
       
@Future Date Now 보다 미래의 날짜, 시간이어야 한다.  
@FutureOrPresent Date Now 거나 미래의 날짜, 시간이어야 한다.  
@Past Date Now 보다 과거 의의 날짜, 시간이어야 한다.  
@PastOrPresent Date Now 거나 과거의 날짜, 시간이어야 한다.  
       
@AssertTrue boolean 값이 항상 True여야 한다.  
@AssertFalse boolean 값이 항상 False여야 한다.  
@Size int 값이 min과 max사이에 있어야한다. @Size(max = 10, min = 1)

 

Comments