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을 발생시키고 예외에 대한 메시지를 명확하게 전달하는 것이 효과적입니다
참고
'부트캠프 기록 > Section3' 카테고리의 다른 글
[Spring MVC] JBDC 기반 데이터 엑세스 계층 (0) | 2022.10.30 |
---|---|
[Spring MVC] API 계층_DTO(Data Transfer Object) (0) | 2022.10.29 |
[Spring MVC] API계층_Controller (0) | 2022.10.29 |
[Spring MVC] DTO 클래스와 Entity 클래스의 역할 분리 이유 (0) | 2022.10.24 |
[Spring MVC] Spring MVC 아키텍처 (0) | 2022.10.22 |