@Valid 정리해보기

UkJJang·2022년 4월 28일
0

자바 @Valid 사용해보기

1. Valid를 사용하는 방법

  • @Valid 애노테이션을 이용하면, 객체 안에서 들어오는 값에 대해 검증이 가능해진다.

1-1 @Valid 적용시키기


public class ProductRequest {
    
    @NotNull // 인자로 들어온 필드 값에 null 값을 허용하지 않음
    private String productName;
    
    @Email // 이메일 형식에 맞춘 값이 들어와야함
    private String email;
    
}

@RestController
public class ProductController {
    @PostMapping("/api/v1/product")
    public Product save(@Valid @RequestBody ProductRequest productRequest) {
        ~~~
    }
}
  • 값이 올바르게 들어오지 않았다면 MethodArgumentNotValidException 예외와 400 Bad Request 상태코드를 반환하게 된다.

2. 검증 애노테이션 종류

2-1 문자열 검증

  • @NotBlack
    • null이 아닌 값
    • 공백이 아닌 문자를 하나 이상 포함해야한다.
    • 반드시 값이 존재하고 공백 문자를 제외한 길이가 0보다 커야한다.
  • @NotEmpty
    • null 이거나 empty(빈 문자열)가 아니어야 한다.
    • 반드시 값이 있어야하며 길이가 0보다 커야아한다.
  • @NotNull
    • null이 아닌 값은 어떤 타입이든 상관없다.
    • 반드시 값이 있어야함
  • @Null
    • 타입은 상관없으며 null값 허용
null "" " "
@NotNull X O O
@NotEmpty X X O
@NotBlank X X X

2-2 최대 / 최소 검증

public class MaxOrMin {
    @DecimalMax(value = "10000000")
    private BigInteger decimalMax;
    @DecimalMin(value = "1")
    private BigInteger decimalMin;
    @Max(value = 1000000)
    private Integer max;
    @Min(value = 1)
    private Integer min;
}
  • @DecimalMax
    • 지정된 최댓값보다 작거나 같아야함.
  • @DecimalMin
    • 지정된 최솟값보다 크거나 같아야함.
  • @Max
    • 지정된 최댓값보다 작거나 같아야함.
  • @Min
    • 지정된 최솟값보다 크거나 같아야함.

Decimal과 기본 Max/Min의 차이는 범위 값의 차이다. String을 사용하는지 Integer를 사용하는지에 따라 범위가 달라지기 때문이다.

2-3 범위 검증

public class Range {
    @Positive
    private Integer positive;
    @PositiveOrZero
    private Integer positiveOrZero;
    @Negative
    private Integer negative;
    @NegativeOrZero
    private Integer negativeOrZero;
}
  • @Positive
    • 양수인 값
  • @PositiveOrZero
    • 0이거나 양수인 값
  • @Negative
    • 음수인 값
  • @NegativeOrZero
    • 0이거나 음수인 값

2-4 시간 값 검증

public class Time {
    @Future
    private Date future;
    @FutureOrPresent
    private Date futureOrPresent;
    @Past
    private Date past;
    @PastOrPresent
    private Date pastOrPresent;
}
  • @Future
    • Now 보다 미래의 날짜, 시간이어야 한다.
  • @FutureOrPresent
    • Now 거나 미래의 날짜, 시간이어야 한다.
  • @Past
    • Now 보다 과거의 날짜, 시간이어야 한다.
  • @PastOrPresent
    • Now 거나 과거의 날짜, 시간이어야 한다.

2-5 Bolean 검증

public class Bool {
    @AssertTrue
    private boolean assertTrue;
    @AssertFalse
    private boolean assertFalse;
}
  • @AssertTrue
    • 항상 True 여야 한다.
  • @AssertFalse
    • 항상 False 여야 한다.

2-6 크기 검증

public class Size {
    @Size(max=25, min=7)
    private String sizeString;
}
  • @Size
    • max > 값의 크기가 max보다 작거나 같아야 한다.
    • min > 값의 크기가 min보다 크거나 같아야 한다.

이 외에도 추가적인 것들이 더 있다.

https://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/

3. 자바 Valid 제공하지 않는것은 무엇일까?

  • Valid는 @Validated와 다르게 그룹 유효성 검사를 지원하지 않는다는 차이점이 있다.
    • 이러한 경우에는 @Validated 애노테이션을 이용해야 한다.
public class Account {
    
    @NotNull
//    @NotNull(groups = BasicInfo.class) @Validated 사용
    private String password;
    
    @Email
//    @Email(groups = BasicInfo.class) @Validated 사용
    private String email;
    
    // 나중에 필드가 추가된다면? 현재 기준으로 작성되었던 테스트도 실패하게 된다.
}

https://www.baeldung.com/spring-valid-vs-validated

profile
꾸준하게 성실하게

0개의 댓글