[Spring Boot] `@NotEmpty`, `@NotBlank`, `@NotNull` 이란?
https://yejincode.tistory.com/14
[Spring Boot] 질문, 답변 등록 with REST API
질문 등록 ✏️ 처음 내가 만든 코드 RESTful 하게 url을 만들어 보고자, url을 아래와 같이 구성해 보았다. GET /question : 질문 객체 생성 폼 POST /question : 질문 객체 생성 GET /questions : 질문 객체 리스트
yejincode.tistory.com
위 게시글에 이어지는 내용입니다.
subject와 content 는 비어있으면 안되기 때문에,
@NotEmpty어노테이션으로 값이 없을 때 message 를 주도록 하였다.
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
@Getter
@Setter
public class QuestionCreateForm {
@Size(max=25)
@NotEmpty(message = "제목을 입력해 주세요.")
private String subject;
@NotEmpty(message = "내용을 입력해 주세요.")
private String content;
}
javax.validation.contraints. 에는 null 관련한 어노테이션이 3가지가 더 있었다.
3가지가 각각 어떤 차이점이 있는 것일까?
NotNull | The annotated element must not be null. null 이 아니면 된다. (비어있어도 된다.) |
any type. |
NotEmpty | The annotated element must not be null nor empty. 공백을 포함해서 비어있지 않으면 된다. |
CharSequence (length of character sequence is evaluated) Collection (collection size is evaluated) Map (map size is evaluated) Array (array length is evaluated) |
NotBlank | The annotated element must not be null and must contain at least one non-whitespace character. 공백이 아닌 문자가 단 1개라도 있어야 한다. |
CharSequence |
@NotEmpty 를 할 경우, 값이 isEmpty 인지 판별하기 때문에
생성된 BindingResult 객체의 target을 보면 아래와 같이 빈값을 넣은 content에 “” 비어있는 filed 값이 들어있고,
BindingResult 객체의 errors 필드를 보면 content 필드가 리스트에 추가되어있는 것을 볼 수 있다.
에러 메세지를 보면 rejected value가 [] 이다. 라고 나오며 error 필드의 rejectedValue 필드에 [] 값이 들어있는 것을 확인 할 수 있다.
@NotNull 을 할 경우, 값이 비어있지 않는 것만 확인하기 때문에 값이 없는 질문이 정상적으로 등록되어 버린다.
생성된 BindingResult 객체의 target을 보면 마찬가지로 content의 값은 “” 비어있는 값이 들어가 있지만, error 에는 추가되지 못한다.
@NotBlank vs @NotEmpty
subejct 에는 @NotEmpty 를 content에는 @NotBlank 를 설정하였다.
동일하게 공백문자 1개 “ ” 의 값을 넣으면
@NotEmpty 는 공백문자 또한 비어있지 않는 것이기 때문에 정상적으로 등록된다.
하지만, @NotBlank 는 “ “ 공백문자가 아닌 whitespace 가 아닌 문자가 단 하나라도 있지 않으면 error 필드에 추가한다.
따라서 질문의 경우 제목은 공백만 있는 것도 안되므로 @NotBlank 내용은 공백만 넣는 것은 허용으로 @NotEmpty 로 수정하였다.
@Size(max=30, message = "제목은 30자 이하로 입력해 주세요.")
@NotBlank(message = "제목을 입력해 주세요.")
private String subject;
@NotEmpty(message = "내용을 입력해 주세요.")
private String content;