<aside> 💡 DTO의 값을 검증하는 경우에(특히 Request 시) 사용 할 수 있습니다.

</aside>

0. 사전 설정

GlobalExceptionHandler에 아래 코드 추가

해당 코드는 Valid 실패 시 발생하는 예외를 catch해 400번 응답을 전송합니다.

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorDTO> dtoValidation(final 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);
    });

    ErrorDTO errorDTO = new ErrorDTO("", errors.toString());
    return ResponseEntity.status(HttpStatus.BAD_REQUEST)
            .body(errorDTO);
}

응답 예시: @Positive에 대한 검증(@Valid) 실패 시 다음과 같은 응답을 받을 수 있습니다.

스크린샷 2023-08-07 오전 4.40.42.png

1. DTO에 조건 지정

@Positive는 해당 필드가 0보다 큰 양수임을 명시합니다.

public static class CartItemQuantity {
    private Long id;

    @Positive
    private Integer quantity;
}

Validation를 제공하는 어노테이션은 많으니 검색해보세요.

2. @Vaild 수행

해당 DTO를 사용하는 Controller의 @RequestBody 앞에 @Valid를 사용하면 유효성을 검증합니다.

@PatchMapping
public ResponseEntity<CartResponseDTO.CartListItem> updateCartItemQuantity(@CurrentUser User user, @Valid @RequestBody CartRequestDTO.CartItemQuantity cartItemQuantity) {
    CartResponseDTO.CartListItem cartListItem = cartService.updateCartItemQuantity(cartItemQuantity, user);
    return ResponseEntity.ok(cartListItem);
}