[TIL] Spring @Valid Annotaion

정석·2024년 8월 15일

TIL

목록 보기
19/40
post-thumbnail

웹에서 body 로 받은 값을 Dto 로 보낼 때 필수적으로 값이 들어와야 하는 것들을 설정하고 싶을 수 있다.
예를 들면 비밀번호라던지 아이디라던지 null 값이 들어오지 않고 무조건! 값을 입력 받도록 하고 싶다면?

그렇다면 값을 입력 받을 때 애초에 원하는 필드의 값이 들어있지 않다면 예외를 발생시키면 된다!

그래서 Spring 에선 Valid 라는 유효성 체크를 돕는 기능이 존재한다.

활용하는 방법을 순차적으로 작성해본다.

1. 의존성 추가

우선 build.gradle 에서 valdation 에 대한 의존성을 추가해준다.

  • 코드
// Valid
implementation 'org.springframework.boot:spring-boot-starter-validation'

2. 값을 맵핑할 Dto 에서 valid 를 사용할 변수에 valid 옵션 기입

예시로 비밀번호를 무조건 입력 받도록 할 예정이고,

content 로 들어오는 값의 길이를 200으로 제한 해본다.

valid 할 변수 위에 어노테이션을 붙이며, message 에 예외로 출력할 에러 메시지를 기입한다.

사진과 같이 NotBlank 를 사용하면 빈 문자열이 값으로 들어오는 경우를 체크해준다.

Sizemax 값을 지정하여 들어오는 값의 길이를 제한하여 알아서 확인한다.

이 때, 한 가지 궁금한 점이 있었는데 NotBlank 말고 NotNull 어노테이션도 존재하는데 차이가 뭔지 궁금했다.

NotNull객체가 null 값인지 확인하고
NotBlank 는 문자열 타입에 대해 문자열이 빈 경우를 체크한다.

언젠간 분명 내가 들어와서 써 먹기 위해 Validation 의 다른 어노테이션들을 정리해봤다. (글 하단에)


3. 마지막으로 예외 처리

자 그럼 valid 에서 걸리는 예외들을 처리해줘야 한다.
Valid 어노테이션에서 발생하는 예외는 MethodArgumentNotValidException 예외 클래스다.
따라서 간단하게 해당 예외를 handler에 추가하면 끝!


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


4. 결과


그러면 앞에서 설정했듯이 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)

0개의 댓글