@NotNull, @NotEmpty, @NotBlank 의 차이점

김학준·2024년 6월 17일
0

게시판

목록 보기
28/44
어노테이션설명적용 대상허용되지 않는 예시
@NotNullnull이 아님모든 타입null
@NotEmptynull이 아니고, 요소가 1개 이상Collection, Map, Array, Stringnull, ""
@NotBlanknull이 아니고, 공백이 아닌 문자가 1개 이상Stringnull, "", " "

다음은 REST API 요청 값을 검증하고 Bean Validation 예외를 처리하는 방법을 정리한 내용이다:

REST API 요청 값 검증 및 Bean Validation 예외 처리

1. 요청 값 검증

DTO 클래스에 검증 어노테이션 추가

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class UserDTO {

    @NotNull(message = "ID cannot be null")
    private Long id;

    @NotBlank(message = "Name cannot be blank")
    @Size(min = 2, max = 30, message = "Name must be between 2 and 30 characters")
    private String name;

    // getters and setters
}

컨트롤러에서 검증 적용

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @PostMapping
    public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) {
        // 유효성 검증에 통과하면 로직 실행
        return ResponseEntity.ok("User is valid");
    }
}

2. Bean Validation 예외 처리

Bean Validation에서 발생하는 예외를 처리하기 위해 @ControllerAdvice@ExceptionHandler를 사용하여 전역 예외 처리기를 구현할 수 있다.

전역 예외 처리기 구현

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }
}

예외 발생 시 응답 예시

POST /api/users 요청에서 유효성 검증에 실패하면, 다음과 같은 형태의 응답을 받게 된다.

{
  "id": "ID cannot be null",
  "name": "Name must be between 2 and 30 characters"
}

3. 정리

  • DTO 클래스에 유효성 검증 어노테이션 적용: @NotNull, @NotBlank, @Size 등의 어노테이션을 사용하여 필드 단위의 유효성을 검증한다.
  • 컨트롤러에서 유효성 검증 적용: @Valid 또는 @Validated 어노테이션을 사용하여 컨트롤러 메서드의 파라미터로 전달된 객체를 검증한다.
  • 전역 예외 처리기 구현: @ControllerAdvice@ExceptionHandler를 사용하여 유효성 검증 실패 시 발생하는 예외를 처리하고 적절한 응답을 반환한다.

이 방법을 통해 REST API 요청 값의 유효성을 검증하고, 유효성 검증 실패 시 사용자에게 명확한 오류 메시지를 제공할 수 있다.

0개의 댓글