[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개의 어노테이션 중 가장 엄격한 어노테이션이라고 볼 수 있다.

 

멤버의 성격에 맞게 세 개의 어노테이션 중 적절한 어노테이션을 골라야 한다.

 

 

 


참고

 

[1] https://beanvalidation.org/2.0/

반응형

댓글

Designed by JB FACTORY