[TIL] @Valid 예외를 @RestControllerAdvice에서 처리하기

phdljr·2023년 11월 20일
0

TIL

목록 보기
33/70

프로젝트를 진행하던 도중, 예외 처리를 해야되는 부분이 있었다.

@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에서 @ExceptionHandler로 처리하기

스프링에서 예외가 발생하면 이를 처리해주는 클래스인 @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

profile
난 Java도 좋고, 다른 것들도 좋아

0개의 댓글