ValidationConstraint
🧩 Bean Validation 제약 조건
정의
@NotNull,@NotEmpty,@NotBlank는 Bean Validation에서 값의 존재 여부를 검증하는 대표적인 제약 조건 애너테이션이다. 비슷해 보여도 검증 대상과 허용 범위가 다르다.
@NotNull은 null 여부만 검사한다.@NotEmpty는 null이 아니고 비어 있지 않아야 한다.@NotBlank는 문자열에서 null, 빈 문자열, 공백 문자열을 모두 허용하지 않는다.
⚙️ 각 애너테이션의 비교
| 애너테이션 | null 허용 | 빈 문자열 허용 | 공백 문자열 허용 | 컬렉션 검사 | 주요 대상 |
|---|---|---|---|---|---|
@NotNull |
❌ 불가 | ✅ 허용 | ✅ 허용 | ❌ | 모든 타입 |
@NotEmpty |
❌ 불가 | ❌ 불가 | ✅ 허용 | ✅ | String, 배열, 컬렉션 |
@NotBlank |
❌ 불가 | ❌ 불가 | ❌ 불가 | ❌ | 문자열(String) |
핵심 차이
@NotNull: 값이 존재해야 한다.@NotEmpty: 값이 존재하면서 길이 또는 크기가 0보다 커야 한다.@NotBlank: 문자열이면서 공백만 있는 값도 허용하지 않는다.
🛠 사용 예시
public class UserRequest {
@NotNull
private String id; // 반드시 값이 존재해야 함
@NotEmpty
private List<String> tags; // null 또는 빈 리스트 허용하지 않음
@NotBlank
private String name; // " " 공백도 허용하지 않음
}
🛠 메시지 커스터마이징 예시
@NotBlank(message = "이름은 필수 입력 항목입니다.")
private String name;
@NotEmpty(message = "최소 하나의 태그가 필요합니다.")
private List<String> tags;
@NotNull(message = "ID는 null일 수 없습니다.")
private Long id;
✅ 언제 어떤 애너테이션을 써야 할까?
@NotNull은 null 여부만 확인할 때 사용한다.@NotEmpty는 문자열, 배열, 컬렉션이 비어 있으면 안 될 때 사용한다.@NotBlank는 사용자 입력 문자열에서 공백만 입력된 경우까지 막고 싶을 때 사용한다.
⚠️ 주의사항
@NotBlank는 문자열 전용이다.@NotEmpty는 문자열뿐 아니라 컬렉션과 배열에도 사용할 수 있다.- 실제 요청 검증에서는 보통
@Valid와 함께 사용한다. - 검증 실패 시 어떤 메시지를 보여줄지
message속성으로 조정할 수 있다.
📌 정리
@NotNull,@NotEmpty,@NotBlank는 서로 비슷하지만 허용 범위가 다르다.- 가장 자주 헷갈리는 부분은 빈 문자열과 공백 문자열의 차이다.
- 입력 검증에서는 대상 타입과 허용 조건을 먼저 생각하고 애너테이션을 고르는 것이 좋다.
댓글남기기