웹에서 body 로 받은 값을 Dto 로 보낼 때 필수적으로 값이 들어와야 하는 것들을 설정하고 싶을 수 있다.
예를 들면 비밀번호라던지 아이디라던지 null 값이 들어오지 않고 무조건! 값을 입력 받도록 하고 싶다면?
그렇다면 값을 입력 받을 때 애초에 원하는 필드의 값이 들어있지 않다면 예외를 발생시키면 된다!
그래서 Spring 에선 Valid 라는 유효성 체크를 돕는 기능이 존재한다.
활용하는 방법을 순차적으로 작성해본다.
우선 build.gradle 에서 valdation 에 대한 의존성을 추가해준다.

// Valid
implementation 'org.springframework.boot:spring-boot-starter-validation'
예시로 비밀번호를 무조건 입력 받도록 할 예정이고,
content 로 들어오는 값의 길이를 200으로 제한 해본다.

valid 할 변수 위에 어노테이션을 붙이며,
message에 예외로 출력할 에러 메시지를 기입한다.
사진과 같이 NotBlank 를 사용하면 빈 문자열이 값으로 들어오는 경우를 체크해준다.
Size 는 max 값을 지정하여 들어오는 값의 길이를 제한하여 알아서 확인한다.
이 때, 한 가지 궁금한 점이 있었는데 NotBlank 말고 NotNull 어노테이션도 존재하는데 차이가 뭔지 궁금했다.
NotNull은객체가 null값인지 확인하고
NotBlank는 문자열 타입에 대해문자열이 빈 경우를 체크한다.
언젠간 분명 내가 들어와서 써 먹기 위해 Validation 의 다른 어노테이션들을 정리해봤다. (글 하단에)
자 그럼 valid 에서 걸리는 예외들을 처리해줘야 한다.
Valid 어노테이션에서 발생하는 예외는 MethodArgumentNotValidException 예외 클래스다.
따라서 간단하게 해당 예외를 handler에 추가하면 끝!

사진과 같이 GlobalExceptionhandler 클래스에 해당 예외를 처리할 수 있도록 추가했다.

그러면 앞에서 설정했듯이 password 값이 기입되지 않으면 message 에서 작성한 멘트가 출력된다.
| 애노테이션 | 설명 | 예시 적용 값 |
|---|---|---|
@NotNull | 필드가 null이 아니어야 함. | @NotNull |
@Null | 필드가 null이어야 함. | @Null |
@NotEmpty | 문자열이나 컬렉션이 null이 아니고, 비어있지 않아야 함. | @NotEmpty |
@NotBlank | 문자열이 null이 아니고, 공백이 아닌 문자가 최소한 하나 있어야 함. | @NotBlank |
@Size | 문자열, 컬렉션, 배열 등의 길이가 지정된 범위 내에 있어야 함. | @Size(min = 2, max = 14) |
@Min | 숫자가 지정된 최소값 이상이어야 함. | @Min(18) |
@Max | 숫자가 지정된 최대값 이하여야 함. | @Max(65) |
@Positive | 숫자가 양수이어야 함. | @Positive |
@PositiveOrZero | 숫자가 양수이거나 0이어야 함. | @PositiveOrZero |
@Negative | 숫자가 음수이어야 함. | @Negative |
@NegativeOrZero | 숫자가 음수이거나 0이어야 함. | @NegativeOrZero |
@DecimalMin | 소수점 숫자가 지정된 최소값 이상이어야 함. | @DecimalMin("1.5") |
@DecimalMax | 소수점 숫자가 지정된 최대값 이하여야 함. | @DecimalMax("100.5") |
@Digits | 숫자가 지정된 자릿수와 소수 자릿수를 가져야 함. | @Digits(integer = 3, fraction = 2) |
@Past | 날짜가 과거이어야 함. | @Past |
@PastOrPresent | 날짜가 과거이거나 현재이어야 함. | @PastOrPresent |
@Future | 날짜가 미래이어야 함. | @Future |
@FutureOrPresent | 날짜가 미래이거나 현재이어야 함. | @FutureOrPresent |
@Pattern | 문자열이 지정된 정규 표현식과 일치해야 함. | @Pattern(regexp = "^[a-zA-Z0-9]+$") |
@Email | 유효한 이메일 형식이어야 함. | @Email |
@AssertTrue | 값이 true여야 함. | @AssertTrue |
@AssertFalse | 값이 false여야 함. | @AssertFalse |
@Valid | 객체의 필드에서 재귀적으로 유효성 검사를 수행함. | @Valid |
@CreditCardNumber | 유효한 신용카드 번호 형식이어야 함 (Hibernate Validator 제공). | @CreditCardNumber |
@Length | 문자열의 길이가 지정된 범위 내에 있어야 함 (Hibernate Validator 제공). | @Length(min = 2, max = 14) |
@Range | 숫자의 범위가 지정된 범위 내에 있어야 함 (Hibernate Validator 제공). | @Range(min = 1, max = 100) |