반응형
Validation이란?
클라이언트가 보낸 데이터가 올바른지 검증하는 과정
주요 어노테이션:
@NotNull: null 값만 체크(빈 문자열은 허용)@NotBlank: null, 빈 문자열(""), 공백(" ")만으로 이루어진 문자열 모두 체크@NotEmpty: null, 빈 문자열("") 체크 (공백만 있는 문자열은 허용), 실무에서 잘 사용 안 함
어노테이션별 검증 결과 비교
// 테스트 값들
String value1 = null; // null
String value2 = ""; // 빈 문자열
String value3 = " "; // 공백만
String value4 = "4인용 텐트"; // 정상 값 (단어 사이 공백 포함)
비교표
| 값 | @NotNull | @NotBlank | @NotEmpty |
null |
실패 | 실패 | 실패 |
"" (빈 문자열) |
통과 | 실패 | 실패 |
" " (공백만) |
통과 | 실패 | 통과 |
"4인용 텐트" |
통과 | 통과 | 통과 |
실무 사용 가이드
1. String 필드 → @NotBlank 사용
@NotBlank // 가장 엄격한 검증으로 권장
private String name;
@NotBlank
private String description;
// 잘못된 예시
@NotNull // 빈 문자열 "" 허용되어 버림.
private String name;
- @NotBlank는 String 타입에만 사용 가능
- 사용자가 이름을 공백("")으로만 입력하는 것 방지
" "같은 무의미한 데이터를 차단- 실제 서비스에서 가장 안전한 방법
2. Enum/숫자 필드 → @NotNull 사용
- Enum과 숫자는 "빈 문자열" 개념이 없으므로 @NotNull을 사용
실제 사용 예시
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class CampingItemCreateRequest {
@NotBlank // String → @NotBlank
private String name;
@NotNull // Enum → @NotNull
private CampingCategory category;
@NotBlank // String → @NotBlank
private String model;
@NotBlank // String → @NotBlank (공백으로만 이루어진 설명 방지)
private String description;
@NotNull // 숫자 → @NotNull
private Integer stockQuantity;
@NotNull // BigDecimal → @NotNull
private BigDecimal baseDailyRate;
@NotNull // Enum → @NotNull
private CampingItemStatus status;
}
검증 실패 시 동작하는 과정
잘못된 요청 예시
POST /api/camping-items
{
"name": " ", // 공백만 있음
"category": "TENT",
"model": "", // 빈 문자열
"description": "좋은 텐트",
"stockQuantity": null, // null
"baseDailyRate": 50000,
"status": "AVAILABLE"
}
응답 결과
HTTP 400 Bad Request
{
"errors": [
{
"field": "name",
"message": "must not be blank"
},
{
"field": "model",
"message": "must not be blank"
},
{
"field": "stockQuantity",
"message": "must not be null"
}
]
}
자주 헷갈리는 포인트
Q: "4인용 텐트"는 공백이 있는데 @NotBlank로 통과되나요?
A: 네!
@NotBlank
private String name;
// 이런 값들은 모두 통과
"4인용 텐트" // 단어 사이 공백 OK
"구스다운 침낭" // 단어 사이 공백 OK
"MSR 허브허브 텐트" // 여러 공백 OK
// 이런 값들은 실패
" " // 공백만 있음
"" // 빈 문자열
null // null
핵심 정리
1. String 필드
@NotBlank private String name;
@NotBlank private String description;
2. Enum 필드
@NotNull private CampingCategory category;
@NotNull private CampingItemStatus status;
3. 숫자 필드
@NotNull private Integer stockQuantity;
@NotNull private BigDecimal baseDailyRate;
정리
- String은 @NotBlank, 나머지는 @NotNull
반응형
'SPRING BOOT' 카테고리의 다른 글
| [SPRING BOOT] 전역 예외 처리 구현하기 (@RestControllerAdvice) (0) | 2026.02.02 |
|---|---|
| [SPRING BOOT] Static Factory Method 패턴 이해하기 (0) | 2026.01.07 |
| [개발 기록] MyBatis에서 복호화 컬럼이 VO에 매핑되지 않는 원인과 해결 (0) | 2025.06.20 |
| [개발 기록] 레거시 조인 문제와 Active User 통계 처리 전략 (0) | 2025.06.18 |
| SpringBoot 프로젝트에서 JPA 어노테이션 에러 해결방법(jakarta.persistence.*;) (0) | 2025.02.22 |