[Spring] @NotNull, @NotEmpty, @NotBlank의 차이, 사용법
Bean Validation
API를 개발하다 보면 DTO에 들어오는 값을 검증해야 할 때가 있다.
예를 들어 이름은 공백이면 안된다던지, 휴대폰 번호는 null이 아니 여야 한다는 등의 조건들이 있을 것이다.
이러한 검증은 Jakarta Bean Validation에서 제공하는 @NotNull @NotBlank, @NotEmpty 등의 어노테이션을 활용하면 간단하다.
어노테이션을 적용하지 않을 경우
@PostMapping(...)
public ResponseEntity buy(@RequestBody BuyRequestDto buyRequestDto){
if(buyRequestDto.getName() == null){
return new ResponseEntity("Error", HttpStatus.BAD_REQUEST);
}
// 비즈니스 코드
...
}
컨트롤러에서 DTO의 요소를 검사하기 위해서는 위와 같이 요소 하나하나를 검사하는 코드를 작성해야 한다.
이는 매우 귀찮고 비효율적이다.
하지만 어노테이션을 사용하면 간단하다.
@NotNull, @NotBlank, @NotEmpty 사용법
public class BuyRequestDto{
@NotNull
String name;
@NotEmpty
String phoneNumber;
...
}
우선 DTO에서 원하는 멤버에 @NotNull, @NotBlank, @NotEmpty 중 원하는 어노테이션을 작성해 준다.
@PostMapping(...)
public ResponseEntity buy(@Valid @RequestBody BuyRequestDto buyRequestDto){
// 비즈니스 코드
...
}
이후 컨트롤러에서 DTO 파라미터에 @Valid 어노테이션을 달아주기만 하면 끝이다.
참고로 @NotNull, @NotBlank, @NotEmpty 뿐만 아니라 최소, 최대 사이즈를 지정할 수 있는 @Size, 이메일 형식인지 체크하는 @Email 등 다양한 어노테이션을 지원하니 궁금하다면 참고[1]를 참고하자.
@ControllerAdvice
public class GlobalExceptionHandler{
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity MethodArgumentNotValidException(MethodArgumentNotValidException e){
log.warn(e.printStackTrace());
return new ResponseEntity("Error", HttpStatus.BAD_REQUEST);
}
}
@ControllerAdvice 어노테이션이 달려있는 ExceptionHandler 클래스에서 MethodArgumentNotValidException 예외를 처리할 수 있다.
만약 DTO의 검증에 실패하면 MethodArgumentNotValidException 에러를 던지고, MethodArgumentNotValidException 예외를 핸들링하는 핸들러가 예외를 처리할 수 있다.
@NotNull,@NotEmpty, @NotBlank 차이
@NotNull, @NotBlank, @NotEmpty의 차이는 뭘까?
@NotNull
@NotNull은 말 그대로 Null을 허용하지 않는다.
다만 ""(empty)이나 " "(blank)은 허용한다.
@NotEmpty
@NotEmpty는 null, ""(empty)를 허용하지 않는다.
다만 " "(blank)는 허용한다.
@NotBlank
@NotBlank는 null, ""(empty) , " "(blank)을 모두 허용하지 않는다.
따라서 3개의 어노테이션 중 가장 엄격한 어노테이션이라고 볼 수 있다.
멤버의 성격에 맞게 세 개의 어노테이션 중 적절한 어노테이션을 골라야 한다.
참고