본문 바로가기

Development/Spring

[Springboot] @NotNull, @NotEmpty, @NotBlank의 차이점

"Bean Validation is a standard validation specification that allows us to easily validate domain objects by using a set of constraints declared in the form of annotations."

 

Springboot에서 Controller layer로 들어오는 Domain의 유효성을 검사할때

Bean Validation을 사용하여 편리하게 유효성을 검사할 수 있습니다.

이를 위해선 단순히 Domain 객체의 Field에 유효성이 필요한 어노테이션을 선언합니다.

그러나 각 어노테이션들의 기능을 이해하지 못하면 정확한 유효성 검사를 할 수 없습니다.

 

제가 겪은 어노테이션 헷갈렸던 어노테이션들은 @NotNull, @NotEmpty, @NotBlank입니다.

@NotNull, @NotEmpty, @NotBlank 셋의 차이는?

@NotNull

@NotNull은 뜻 그대로, 필드의 값이 Null이 들어오는 것을 허용하지 않습니다.

단, "" 과 같은 빈 문자열 또는 [] 같은 빈 배열 등을 허용합니다.

Null이 들어올 경우 ConstraintViolation Exception을 발생시킵니다.

또한 Null이 들어올 수 있는 어떤 타입에 사용될 수 있습니다.

 

@NotEmpty

@NotBlank는 @NotNull을 포함하여, 객체의 size 또는 length가 0일 경우에 ConstraintViolation Exception을 발생시킵니다.

@NotEmpty는 CharSequenceCollectionMap, or Array 타입을 지원합니다.

 

@NotBlank

@NotBlank는 NotBlankValidator.class를 사용하며, character sequence's trimmed length가 0일 경우  ConstraintViolation Exception을 발생시킵니다. 

즉 @NotEmpty의 경우 "       "와 같은 whitespace character가 올 수 있지만, @NotBlank는 이를 허용하지 않습니다.

@NotEmpty는 String, CharSequence 타입을 지원합니다.

잠깐, CharSequence랑 String은 무슨 차이인데?

CharSequenceString과 달리 가변(mutable)적인 특성을 가집니다. 즉, StringBuilderStringBuffer와 같은 클래스는 문자열을 변경할 수 있습니다.

String은 Java에서 가장 많이 사용되는 클래스 중 하나이며, 문자열을 나타내는 데 사용됩니다. String은 불변(immutable) 클래스이기 때문에 한 번 생성되면 내용을 변경할 수 없습니다.

 

참고 자료

https://www.baeldung.com/java-bean-validation-not-null-empty-blank

https://dudmy.net/android/2017/09/15/difference-char-string/