문제 상황
🐥 카카오 테크 캠퍼스 - 2단계 5주차 과제 수행 중에 global Exception Handler를 사용하는 과제가 있었다
code를 작성하면서, 직접 에러를 확인하고 싶어서, 아래와 같이 핸들러를 작성하고 실행했다
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception500.class)
public ResponseEntity<String> serverError(Exception500 e){
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("잘 찾아왔다.");
}
}
Controller 코드 : runtime Error를 예시로 삼았다
@GetMapping("/carts")
public ResponseEntity<?> findAll(@AuthenticationPrincipal CustomUserDetails userDetails) {
throw new RuntimeException("Simulating a server error");
}
당연히 실행 결과는, “잘 찾아왔다” 기대했는데 Simulating a server error가 나왔다
이럴리가 없는데…? 하면서 왜 먼저 잡아채가는걸까 고민해보았다
해결 방법 : Exception 처리에 우선 순위가 있다
Spring MVC는 예외가 발생하면 해당 예외를 처리하기 위해 등록된 @ExceptionHandler
가 있는지 먼저 확인한다
즉 예외 클래스와 가장 정확하게 일치하는 예외 핸들러를 사용하기 위해서입니다.
즉, 가장 구체적인 예외 핸들러가 사용되는 거죠
여기서 문제는 RuntimeException
이 Exception
의 하위 클래스라는거다
따라서 RuntimeException
이 발생하면 @ExceptionHandler(Exception.class)
메소드가 호출됩니다
이 메소드는 “Simulating a server error” 메시지를 반환한다
따라서 Exception500
을 던지도록 CartRestController
를 수정하거나,
@ExceptionHandler(Exception.class)
메소드를 수정하여 원하는 메시지를 반환하도록 수정하면 된다
좀 더 공부하자 : 가깝다는 것의 의미
"가장 가까운"은 예외 타입이 일치하는 가장 구체적인 핸들러를 의미한다
Spring MVC는 예외 타입이 일치하는 핸들러를 찾기 위해 클래스 계층을 “위로” 올라간다
예를 들어, NullPointerException
이 발생하면, Spring MVC는 먼저 NullPointerException
타입의 핸들러를 찾는다
만약 그런 핸들러가 없으면, Spring MVC는 상위 클래스인 RuntimeException
타입의 핸들러를 찾는다
하지만, 그런 핸들러가 없으면, 더 상위의 클래스인 Exception
타입의 핸들러를 찾습니다. 이런 식으로 계속 된다
따라서 “가장 가까운” 핸들러를 찾는다는 것은, 예외 타입이 일치하는 가장 구체적인 (즉, 가장 하위의) 핸들러를 찾는다는 것을 의미한다
이것은 클래스 계층을 “위로” 올라가면서 핸들러를 찾는다는 것을 의미한다
결론
문제 상황의 코드를 아래와 같이 수정하면 원하는대로 결과가 나온다
@GetMapping("/carts")
public ResponseEntity<?> findAll(@AuthenticationPrincipal CustomUserDetails userDetails) {
throw new Exception500("Simulating a server error");
}
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Backend' 카테고리의 다른 글
Swagger 사용하는 방법 (0) | 2023.08.03 |
---|---|
ChatGPT로 에러 해결 - Failed to start bean 'documentationPluginsBootstrapper' (0) | 2023.08.03 |
Hibernate (0) | 2023.07.11 |
MyBatis (0) | 2023.07.11 |
Restful API (2) | 2023.07.11 |