부트캠프 기록/Section3

[Spring MVC] 예외처리

bbangduck 2022. 10. 27. 22:58

1. Spring MVC 에서의 예외처리

- @ExceptionHandler를 이용한 예외처리

  • 애플리케이션에서 예외가 발생했을 때, 내부적으로 spring에서 Response Body를 이용해 에러 정보를 전송
  • timestamp, status, error, path
  • 위의 내용만으로는 요청 데이터 중에서 어떤 항목이 유효성 검증에 실패했는지 알 수 없음
  • Controller에 @ExceptionHandler 적용
  • @ExceptionHandler  인자값으로 HttpStatus 를 받을 수 있음
  • 예외가 발생하면 위의 애너테이션이 추가된 메서드가 예외를 전달받음
  • getBindingResult().getFieldErrors()를 통해 에러 정보 확인 가능
  • 위에서 얻은 에러 정보를 ResponseEntity를 통해 Response Body로 전달

 

단점

1. 각각의 Controller 클래스에서 Request Body 에 대한 유효성 검증 실패에 대한 에러 처리를 해야되므로 각 Controller 클래스마다 코드 중복이 발생

2. Controller에서 처리해야 되는 예외가 유효성 검증 실패에 대한 예외만 있는 것이 아니기 때문에

하나의 Controller 클래스 내에서 @ExceptionHandler 를 추가한 에러 처리 핸들러 메서드가 늘어남

이러한 단점을 @RestControllerAdvice 로 해결

 

 

- @RestControllerAdvice를 이용한 예외처리

예외처리를 공통화할 수 있음

JSON 형식의 데이터를 Responde Body로 전송하기 위해 ResponseEntity로 래핑할 필요가 없음

@RestControllerAdvice VS @ControllerAdvice

@RestControllerAdvice = @ControllerAdvice + @ResponseBody

 

 

2. 비즈니스 로직에 대한 예외 처리

- 비즈니적인 예외 처리

체크 예외는 예외를 잡아서(catch) 체크한 후에 해당 예외를 복구 하든가 회피를 하든가 등의 어떤 구체적인 처리를 해야하는 예외

언체크 예외는 예외를 잡아서 해당 예외에 대한 어떤 처리를 할 필요가 없는 예외를 의미

RuntimeException을 상속한 예외는 모두 언체크 예외

RuntimeException을 상속해서 개발자가 직접 사용자 예외(Custom Exception)를 만들 수 있음

사용자 정의 예외를 정의해서 비즈니스 로직에서 발생하는 다양한 예외를 던질 수 있고 , 던져진 예외는 Exception Advice에서 처리

HttpStatus가 동적으로 변경되는 경우에는 ResponseEntity를 사용

 

 

예외 복구 전략이 명확하고 그것이 가능하다면 Checked Exception을 try catch로 잡고 해당 복구를 하는 것이 좋습니다.
하지만 그러한 경우는 흔하지 않으며 Checked Exception이 발생하면 더 구체적인 Unchecked Exception을 발생시키고 예외에 대한 메시지를 명확하게 전달하는 것이 효과적입니다



참고