SpringBoot 로 REST api 를 구현하다 보면 요청에 대한 예외가 발생하는 경우가 있다. 이러한 예외 처리를 잘해주지 않으면 사용자가 원하는 응답을 얻지 못하거나 애플리케이션 자체가 오류로 중단될 수 있다.
SpringBoot 에서는 @ExceptionHandler, HandlerExceptionResolver, @ControllerAdvice, ResponseStatusException 등의 예외처리 방법을 제공해준다.
BasicErrorController
SpringBoot 에서 제공하는 예외 처리 방법들을 살펴보기 전에, SpringBoot 의 기본 예외 처리 방법을 알아보려고 한다.
Spring 은 Controller 를 통해서 클라이언트의 요청을 수신하는데, Controller 에서 발생하는 에러에 대해서는 기본적으로 /error 로 에러에 대한 요청을 다시 전달하도록 WAS 설정을 해두었다. 그리고 /error 로 오는 요청을 처리할 Controller 로 BasicErrorController 를 통해서 처리하도록 되어있다. 이 부분은 SpringBoot 의 WebMvcAutoConfiguration 을 통해서 WAS 에 자동 설정이 된다.
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
...
}
위의 코드는 BasicErrorController 의 선언부이다. server.error.path 로 들어오는 요청을 수신하도록 RequestMapping 로 지정이 되어있는데, 에러 경로의 기본값은 /error 이며 이 값은 appplication.properties 에서 변경할 수 있다.
예외 발생 시에 BasicErrorController 가 동작하는 순서는 다음과 같다.
request -> WAS (Tomcat) -> Filter -> Servlet (Dispatcher Servlet) -> Interceptor -> Controller
-> (Exception 발생) -> Interceptor -> Servlet -> Filter -> WAS
-> (server.error.path 요청) -> Filter -> Servlet -> Interceptor -> Controller (BasicErrorController)
사용자의 요청을 실행하던 중 Controller 에서 에러가 발생하면 WAS 로 에러가 반환된다. WAS 는 에러가 발생하면 /error 로 다시 요청을 보내게 된다. 그러면 이에 대한 요청을 수신하는 BasicErrorController 가 로직에 따라서 응답을 전달한다.
[Reference]
'Tech > Spring | SpringBoot' 카테고리의 다른 글
[SpringBoot] 예외처리 - 3 (@ExceptionHandler, @ResponseStatus, @ControllerAdvice) (0) | 2022.12.20 |
---|---|
[SpringBoot] 예외처리 - 2 (HandlerExceptionResolver) (0) | 2022.12.08 |
[SpringBoot] JUnit 을 이용한 테스트 코드 작성 (0) | 2022.11.28 |
[SpringBoot] SpringBoot 에 lombok 적용하기 (0) | 2022.11.11 |
[Spring] Database 연동 - 4 (JPA) (0) | 2022.10.22 |