프로젝트를 진행하던 도중, 예외 처리를 해야되는 부분이 있었다.
@RestController
@RequestMapping("/api/v1")
public class UserController {
private final UserService userService;
@PostMapping("/user/sign-up")
public ResponseEntity<SignUpResponseDto> signup(
@Valid @RequestBody SignUpRequestDto signUpRequestDto
) {
SignUpResponseDto responseDto = userService.signup(signUpRequestDto);
return ResponseEntity.ok(responseDto);
}
}
컨트롤러단에서 BindingResult
를 사용해 View
로 예외 내용을 전달하는 방식을 배웠지만, 지금 진행되는 프로젝트에는 따로 View가 없다. 즉, REST API 형식
이다.
그렇다면, 이러한 상황에서는 어떻게 BindingResult
내용을 응답 데이터에 넣어서 보낼까?
스프링에서 예외가 발생하면 이를 처리해주는 클래스인 @RestControllerAdvice
에서 처리해줄 수 있다. @Valid
에서 발생한 예외도 스프링에서 처리해줄 수 있다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ValidExceptionResponseDto> handleMethodArgumentNotValidException(
BindingResult bindingResult
) {
ValidExceptionResponseDto responseDto
= new ValidExceptionResponseDto(400, bindingResult);
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(responseDto);
}
@ExceptionHandler(NotFoundCardException.class)
public ResponseEntity<ExceptionResponseDto> handleNotFoundCardException() {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(CustomException.NOT_FOUND_CARD.toDto());
}
}
다른 @ExceptionHandler
와 큰 차이는 없다. 대신, 인자로 BindingResult를 받아와서 처리해주는 차이밖에 없다.
다음 사이트를 확인해보면, 스프링에서 예외를 처리할 수 있는 여러 방법이 소개돼있다. 참고해보면 좋을 듯 하다.
https://www.baeldung.com/exception-handling-for-rest-with-spring