Engineering Note

[Server] @NotNull, @NotEmpty, @NotBlank차이 (Spring Validation) 본문

Server

[Server] @NotNull, @NotEmpty, @NotBlank차이 (Spring Validation)

Software Engineer Kim 2026. 1. 13. 20:23

Validation 체크해서 사용되는 어노테이션 종류

 

Spring Validation에서는:

  • @NotNull: null만 체크 (빈 문자열은 통과)
  • @NotEmpty: null과 empty 체크 (공백만 있으면 통과)
  • @NotBlank: null, empty, blank 모두 체크 (가장 엄격함)

 

문자열 입력을 받을 때는 보통 @NotBlank를 많이 사용한다.

 

문자열 입력을 받을 때는 보통 @NotBlank를 많이 사용하는 이유는 null과 empty와 blank의 개념의 차이를 이해하면 쉽게 납득할 수 있다.

 

자바에서 유효성 검사할 때 사용하는 개념들의 차이

 

null은 객체가 아예 존재하지 않는 상태. 메모리에 할당된 값 자체가 없는 상태

empty는 객체는 존재하지만 내용이 비어있는 상태. 문자열로 치면 ""처럼 길이가 0인 경우

blank는 empty를 포함하면서, 공백 문자(스페이스, 탭, 줄바꿈 등)만 있는 경우도 포함. 예를 들어 " "처럼 공백만 있어도 blank로 판단.

 

 

 

세 가지 개념을 한 번에 이해하기 어렵거나, 헷갈릴 수 있기 때문에 null과 empty의 차이를 이해하고 blank의 개념을 이해하면 좋다.

 

 

Null과 Empty 개념

null vs empty 확실히 구분하기

 
String str1 = null;        // 참조 자체가 없음 (객체 X)
String str2 = "";          // 객체는 있음, 내용만 없음 (객체 O)

str1.length();  // NullPointerException 발생!
str2.length();  // 0 반환 (정상 동작)

 

null은 참조하는 객체 자체가 없어서 메서드를 호출하면 에러가 나지만, empty는 객체가 있으니까 메서드 호출이 가능하다. 그래서 List 필드를 선언할 때 NullPointerException을 방지하기 위해 new ArrayList();로 빈객체로 초기화를 해주도록 권장한다.

 

비유하자면:

  • null: 상자 자체가 없음
  • empty: 빈 상자는 있음

 

 

 

Null, Empty, Blank 정리

String str1 = null;           // null: true, empty: -, blank: -
String str2 = "";             // null: false, empty: true, blank: true  
String str3 = "   ";          // null: false, empty: false, blank: true


Optional<String> opt1 = null;              // null (Optional 객체 자체가 없음)
Optional<String> opt2 = Optional.empty();  // empty (Optional은 있지만 값이 없음)
Optional<String> opt3 = Optional.of("");   // Optional은 있고, 빈 문자열을 담고 있음


List<String> list1 = null;           // null (리스트 객체 자체가 없음)
List<String> list2 = new ArrayList<>();  // empty (리스트는 있지만 요소가 0개)
List<String> list3 = Arrays.asList("a"); // 요소가 있음


그래서 empty라는 개념은:

문자열: ""
Optional: Optional.empty()
컬렉션: new ArrayList<>()처럼 size가 0
배열: new int[0]처럼 length가 0

 

 

주의할 점.

Optional 자체에는 blank 개념이 없다. blank는 문자열에만 해당하는 개념.

정리하면:

  • Optional.empty() → Optional이 empty
  • Optional.of("") → Optional은 empty 아님, 문자열이 empty
  • Optional.of(" ") → Optional은 empty 아님, 문자열이 blank

 

Comments