반응형

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
반응형

+ Recent posts