Q&A
@ModelAttribute로 받은 객체의 API 예외 처리
과거 제가 달았던 답변이 기억이나 다시 답변달아봅니다 ㅎㅎ @ModelAttribute로 바인딩 하는 객체에 @Valid를 붙여주게 되면 입력값에 대한 검증을 해줍니다. @PostMapping("/images") public ResponseEntity uploadImages(@Valid final ImagesUploadRequest imagesUploadRequest) { awsS3Service.uploadFiles(imagesUploadRequest); return ResponseEntity.status(HttpStatus.CREATED) .build(); } 입력값을 검증받을 객체는 다음과 같습니다. @Getter public class ImagesUploadRequest { @NotBlank(message = "카테고리는 반드시 입력해야 합니다.") private String category; @NotNull(message = "이미지는 반드시 첨부해야 합니다.") @Size.List(value = @Size(min = 1, max = 10, message = "최대 10장까지 업로드할 수 있습니다.")) private List files; @Builder private ImagesUploadRequest(final String category, final List files) { this.category = category; this.files = files; } } 이때 입력값 검증이 실패하면 다음과 같이 logging이 되는것을 알 수 있는데요 (제가 고의로 발생시킨 예외는 10장을 초과하는 MultipartFile을 요청으로 보낸 상태입니다.) 2023-08-02 20:11:38.075 WARN 94275 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: 어쩌구 저쩌구 ~~] 이때 org.springframework.validation.BindException라는 예외가 발생했고, 해당 예외를 스프링부트가 로깅해주는것을 알 수 있습니다. 따라서 @ControllerAdvice 혹은 @RestControllerAdvice가 붙은 advice 클래스에 해당 예외를 잡아주게 되면 입력값에 대한 검증 예외를 커스텀하게 처리할 수 있습니다! @RestControllerAdvice public class ControllerAdvice { @ExceptionHandler(BindException.class) public ResponseEntity handleBindException(final BindingResult bindingResult) { String defaultMessage = bindingResult.getFieldErrors() .get(0) .getDefaultMessage(); return ResponseEntity.badRequest() .body(ErrorResponse.builder() .errorCode(CommonErrorCode.BIND_FILED_NOT_VALUE.value()) .message(defaultMessage) .build() ); } } 더불어서 BindingResult 객체 또한 파라미터로 전달받을 수 있으므로 해당 객체를 통해 우리가 커스텀하게 설정했던 예외 메시지를 출력할 수 있습니다. 따라서 다음과 같이 예외 메시지를 커스텀하게 처리할 수 있습니다! // 예외 처리 전 예외 메시지 { "timestamp": "2023-08-02T11:11:38.080+00:00", "status": 400, "error": "Bad Request", "path": "/images" } // 커스텀 예외 처리한 메시지 { "message": "최대 10장까지 업로드할 수 있습니다.", "errorCode": -3000 } (추가로 @RequestBody를 통해 JSON 데이터를 객체로 매핑하는 경우에는 MethodArgumentNotValidException 예외가 발생하므로 해당 예외를 이용해 커스텀하게 예외 응답을 할 수 있습니다!)
- いいね数
- 3
- コメント数
- 2
- 閲覧数
- 1089

