1. ExceptionResolver의 필요성
- 서블릿, WAS로 예외가 전달될 경우의 복잡함

컨트롤러에서 예외가 발생할 경우, 이 예외는 DispatcherServlet을 거쳐 Tomcat 서버인 WAS까지 전달된다.
이 때, WAS는 예외가 발생한 걸 감지하고 /error (기본설정 경로이며, properties / yaml 파일로 변경 가능) 로 다시 요청을 보낸다. 그러면 해당 요청을 스프링부트에서 구현한 BasicErrorController에서 받게 된다.

사용자가 컨트롤러를 직접 구현할 때의 코드와 크게 다르지 않다. 기본적인 어노테이션 및 생성자가 존재한다.
또한 HTTP 요청의 Content-Type에 따라 같은 /error 요청에 대해 다른 타입을 반환하고 있다.

1) 웹 브라우저에서 요청했을 때


2) API 요청을 했을 때


컨트롤러 쪽에서 발생한 예외에 대한 로그가 DispatcherServlet에서 발생하고 있으며, 해당 예외 이후의 에러 페이지에 대한 응답 형태가 요청 방식에 따라 다름을 확인할 수 있다.
2. HandlerExceptionResolver의 필요성
컨트롤러에서 뱉어내는 예외를 처리할 수 있는 계층이 있다면, DispatcherServlet, WAS에 예외를 전달하지 않아도 될 것이다. 스프링은 이와 같은 예외를 처리할 수 있는 역할을 하는 HandlerExceptionResolver를 제공한다. Handler는 Controller를 의미하며, 말 그대로 컨트롤러에서 발생하는 예외를 처리하는 역할을 한다.

그림과 같이 컨트롤러에서 발생한 예외가 HandlerExceptionResolver로 전달되어 처리되고 있다.
스프링에서 제공하는 HandlerExceptionResolver는 세 가지가 있다.
- ExceptionHandlerExceptionResolver
- @ExceptionHandler 어노테이션이 붙은 메서드를 찾아 실행하여, 예외를 처리한다.
- 실무에서 제일 많이 쓰이며, 우선순위가 가장 높다.
- ResponseStatusExceptionResolver
- 사용자가 작성한 Exception 클래스에 @ResponseStatus 어노테이션이 붙어있을 경우, 해당 예외가 발생하면 이 리졸버가 예외처리를 담당한다.
- @ResponseStatus는 주로 응답 코드를 바꾸는데에 사용된다.
- DefaultHandlerExceptionResolver
- 우선순위가 가장 낮으며, 스프링 내부에서 발생하는 기본적인 에러들에 대해 처리한다.
DefaultHandlerExceptionResolver 예시



해당 컨트롤러는 요청이 들어왔을 때, 기본적으로 RuntimeException을 발생시킨다. 하지만 throw 코드가 실행되기 전에, 쿼리 파라미터에 바인딩되는 타입이 일치하지 않아 발생하는 예외를 HandlerExceptionResolver 중 하나인 DefaultHandlerExceptionResolver가 처리하게 된다.


쿼리 파라미터에 정상적인 값을 요청했을 경우, throw 코드가 정상적으로 실행되어 앞서 언급했던 BasicErrorController에 의해 기본적인 에러 JSON이 응답되고 있다.
@ExceptionHandler를 사용하는 예제
https://dip-mazumder.medium.com/spring-boot-exception-handling-best-practices-e8ebe97e8ce
Spring Boot: Exception Handling Best Practices
Use @ControllerAdvice for global exception handling
dip-mazumder.medium.com
스프링 예외 처리 참고 자료
https://supawer0728.github.io/2019/04/04/spring-error-handling/
(Spring Boot)오류 처리에 대해
서론오류 처리는 어플리케이션 개발에 있어 매우 큰 부분을 차지한다.오류를 예측하는 것과 예방하는 것, 그리고 오류를 빨리 발견하고 고칠 수 있는 것은 훌륭한 개발자의 필수조건이라고 생
supawer0728.github.io
https://parkmuhyeun.github.io/woowacourse/2023-04-19-Exception-Handler/
Exception Handler는 어떤 원리로 작동하는가
Exception Handler는 어떤 원리로 작동하는가 19 Apr 2023 in woowacourse on Woowacourse, Spring, Exception-handler, Resolver Exception Handler에 대해 자세히 파고 들어가보자잘못 입력했을 경우마다 다른 에러 메시지, 상
parkmuhyeun.github.io
알면 도움이 될만한 스프링 구조관련 자료
https://gowoonsori.com/blog/spring/architecture/
Spring 요청처리 내부구조
Spring에 요청이 들어왔을때 내부적인 처리 과정 정리
gowoonsori.com
ServletContainer와 SpringContainer는 무엇이 다른가?
Controller 1개는 어떻게 수십 만개의 요청을 처리하는가
sigridjin.medium.com
https://mossgreen.github.io/Servlet-Containers-and-Spring-Framework/
Servlet Container and Spring Framework
Servlet Container vs. Spring Containers (not finished yet)
mossgreen.github.io
'Spring Framework > Spring Boot' 카테고리의 다른 글
[JPA] 스프링 Data JPA 기술을 공부하며 배운 내용 정리 (0) | 2024.08.14 |
---|---|
[JPA] 스프링 JPA 기술을 공부하며 배운 내용 정리 (2) (0) | 2024.08.03 |
[JPA] 스프링 JPA 기술을 공부하며 배운 내용 정리 (1) (0) | 2024.08.03 |
멋사 미션을 하며 스프링 JdbcTemplate에 대해 알게 된 내용 (0) | 2024.05.20 |
관심사의 분리, 의존관계 주입(DI) (0) | 2022.12.30 |