개발자로 후회없는 삶 살기

[spring] @NotNull, @NotEmpty, @NotBlank의 차이점 본문

[백엔드]/[spring+JPA | 이슈해결]

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

몽이장쥰 2023. 4. 30. 16:34

서론

빈 검증 시 사용되는 3가지 어노테이션의 차이를 알아보겠습니다.

 

본론

1. @NotNull

@Data
public class MemberSaveForm {
    @NotNull
    private String userName;
    @NotNull
    private String loginId;
    @NotNull
    private String password;
}

NotNull을 언제 붙이는지 알아봅니다.

 

NotNull의 경우 필드에 null이 들어오면 바인딩 에러가 발생합니다. null이 아닌 ""(공백), " "(띄어쓰기)은 허가하는 3개 중에선 가장 약한 검증입니다.

 

1) 필드가 String 타입

MemberSaveForm처럼 필드가 String 타입인 경우 input 태그에 아무 값도 입력하지 않으면 ""(공백)이 들어가서 회원 가입에 성공하고 bindingResult 로그에도 아무런 로그가 남지 않습니다. 따라서 String 타입에는 보다 강한 검증을 적용해야 합니다.

 

2) 필드가 정수 타입

@Data
public class ItemSaveForm {
    @NotBlank
    private String itemName;
    
    @NotNull
    @Range(min = 1000, max = 1000000)
    @NumberFormat(pattern = "###,###")
    private Integer price;
    
    @NotNull
    @Max(9999)
    @NumberFormat(pattern = "###,###")
    private Integer quantity;

 

필드가 정수 타입이면 @NotNull외에 다른 어노테이션은 붙일 수 없습니다.

 

@NotNull 어노테이션을 붙이면 입력 태그에 아무 값도 넣지 않으면 문자열 타입과 다르게 ""(공백)도 들어가지 않아서 빈 검증에 걸리게 됩니다.

 

@NotBlank
@Range(min = 1000, max = 1000000)
@NumberFormat(pattern = "###,###")
private Integer price;
@NotEmpty
@Max(9999)
@NumberFormat(pattern = "###,###")

정수 타입 필드에 NotEmpty와 NotBlank를 넣고 입력을 해보면

 

정수 타입에 NotEmpty 빈 검증을 할 수 없다는 예외가 터집니다. 정수 타입의 경우 @NotNull만 가능하고 @NotEmpty와 @NotBlank는 불가합니다.

 

3) 기본 타입 int에 @NotNull

// 엔터티
@NotNull
private int age;

// 컨트롤러
@GetMapping("/members/add")
public String addForm(@ModelAttribute Member member) {
    return "members/addMemberForm";
}

기본 타입에 Null을 붙이고 컨트롤러에 @ModelAttribute를 붙이면

 

모델 어트리부터 에러가 발생합니다.

 

2. @NotEmpty

@Data
public class MemberSaveForm {
    @NotEmpty
    private String userName;
    @NotEmpty
    private String loginId;
    @NotEmpty
    private String password;
}

NotEmpty를 언제 붙이는지 알아봅니다.

 

@NotEmpty는 null과 추가로 아무 값도 입력하지 않으면 ""(공백)을 불허합니다. String 타입은 아무 값도 입력하지 않을 시 공백이 들어가서 바인딩 에러를 일으킵니다.

 

bindingResult 로그에도 필드 오류가 남습니다.

 

3. @NotBlank

@Data
public class MemberSaveForm {
    @NotBlank
    private String userName;
    @NotBlank
    private String loginId;
    @NotBlank
    private String password;
}

NotBlank를 언제 붙이는지 알아봅니다.

 

@NotBlank의 경우 null과 공백에 더하여 " "(띄어쓰기)도 불허합니다.

 

@NotBlank
private String userName = " ";

테스트를 위해 띄어쓰기를 초기화하고 실행을 해보면

 

띄어쓰기만 있을 경우 불허하는 모습입니다.

 

결론

이번에는 input 태그로 등록을 할 때 필요한 빈 검증에서 발생할 수 있는 이슈를 다뤄봤습니다. 직접 실행해보면서 브라우저로 확인해 보는 것이 제일 체득하기 좋은 방법이라고 생각합니다.

Comments