@NotBlank / @NotEmpty / @NotNull 차이점
솔로 프로젝트로 To-Do-App 을 구현했다.
얼추 코드를 구현 해놓고 두근두근 떨리는 마음으로 postman 으로 post 요청을 날려봤다.
하지만 역시 에러가 등장 안하면 섭섭하지^^...
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Integer'.
에러 로그는 대충 이러했다.
아무래도 Dto 클래스의 멤버 변수마다 @NotBlank 애너테이션을 적용 시켜서 공백 유효성 검증을 했는데 그게 문제라는 내용인것 같았다.
에러 로그 마지막을 보면 'java.lang.Integer'. 이렇게 되어있는데 아무래도 앞의 내용과 연관지어 생각 해보면 @NotBlank 애너테이션이랑 Integer 타입이 서로 뭔가 문제가 되는 듯 하다.
@NotBlank
그래서 @NotBlank 애너테이션을 타고 들어가봤더니 이 놈은 CharSequence 타입에 대해 null을 허용하지 않고, 최소 한 개 이상의 공백 문자가 아닌 문자를 포함해야 한다.
(String은 CharSequence 구현체이므로 해당된다.)
그러면 내가 구현한 int 타입과 boolean 타입에는 어떤 애너테이션으로 공백 유효성 검증을 해야 할까?
@NotBlank의 대체 애너테이션으로는 @NotEmpty와 @NotNull 애너테이션 두 가지가 더 있는데 서로 뭐가 다른지 알아보자.
@NotEmpty
@NotEmpty 역시 타고 들어가봤더니 이 놈의 경우엔
- CharSequence (length of character sequence is evaluated)
- Collection (collection size is evaluated)
- Map (map size is evaluated)
- Array (array length is evaluated)
위의 나열된 타입에 대해 null, 빈 값을 허용하지 않는다.
예를 들어 내가 구현한 boolean 타입의 completed 멤버 변수의 경우에는 @NotEmpty를 적용할 수 없다.
@NotNull
그럼 @NotBlank와 @NotEmpty 에서 허용하지 않는 타입은 어떻게 공백 유효성 검증을 해야할까?
바로 위에서 언급한 3개의 애너테이션 중 나머지 하나 @NotNull 애너테이션으로 해결 가능하다.
이놈은 모든 타입에 적용 가능하다.