멋사 미션을 하며 스프링 부트 예외처리에 대해 알게 된 내용들

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

 

etc-image-0
https://mossgreen.github.io/Servlet-Containers-and-Spring-Framework/

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

etc-image-1

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

etc-image-2

 

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

etc-image-3etc-image-4

 

2) API 요청을 했을 때
 

etc-image-5etc-image-6

 
컨트롤러 쪽에서 발생한 예외에 대한 로그가 DispatcherServlet에서 발생하고 있으며, 해당 예외 이후의 에러 페이지에 대한 응답 형태가 요청 방식에 따라 다름을 확인할 수 있다.

2. HandlerExceptionResolver의 필요성

컨트롤러에서 뱉어내는 예외를 처리할 수 있는 계층이 있다면, DispatcherServlet, WAS에 예외를 전달하지 않아도 될 것이다. 스프링은 이와 같은 예외를 처리할 수 있는 역할을 하는 HandlerExceptionResolver를 제공한다. Handler는 Controller를 의미하며, 말 그대로 컨트롤러에서 발생하는 예외를 처리하는 역할을 한다. 

etc-image-7
https://gowoonsori.com/blog/spring/architecture/

 
그림과 같이 컨트롤러에서 발생한 예외가 HandlerExceptionResolver로 전달되어 처리되고 있다.
스프링에서 제공하는 HandlerExceptionResolver는 세 가지가 있다.

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

 

DefaultHandlerExceptionResolver 예시

etc-image-8
쿼리 파라미터를 받는 컨트롤러 생성

 

etc-image-9
숫자가 아닌 문자열을 전달했을 때, 반환된 JSON 값
etc-image-10
타입 불일치로 발생한 예외를 DefaultHandlerExceptionResolver가 처리함을 확인할 수 있다.

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

etc-image-11
쿼리 파라미터에 숫자 값을 요청했을 경우, 반환된 JSON 값
etc-image-12

쿼리 파라미터에 정상적인 값을 요청했을 경우, 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

https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5

 

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