Spring/코드 뜯어보기

[Spring Boot] `@NotEmpty`, `@NotBlank`, `@NotNull` 이란?

김yejin 2022. 8. 19. 13:28

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;