어떠한 어플리케이션을 생성할 때마다 항상 고민하는 것은 바로 예외를 어떻게 처리할까에 대한 고찰이다.
특히, 웹 어플리케이션에서는 서버에서 발생한 예외들을 어떻게 할 것인가에 대한 처리가 중요하다고 생각한다.
이 글에서는, spring boot 에서 예외를 처리하는 흐름과, 이를 정의할 수 있는 방법 등에 대한 내용을 적어보려한다.
Spring Boot 예외 처리 흐름
먼저, 내가 공부한 스프링에서 예외처리의 흐름은 아래과 같다.
위의 흐름을 살펴보면 아래와 같이 설명할 수 있다.
1. 클라이언트에서 요청이 들어온다.
2. 디스패처 서블릿이 적절한 컨트롤러로 전달한다.
3. 서비스단에서 비즈니스 로직을 수행한다.
4. 수행 중 예외가 발생한다.
5. 예외를 디스패처 서블릿이 가로채서 처리한다.
6. 예외를 처리할 핸들러 리졸버들을 탐색한다.
7. ExceptionHandlerExceptionResolver에서 사용자가 정의한 Handler가 있으면 해당 핸들러로 예외를 넘긴다.
8. 사용자가 정의한 Handler가 없으면 DefaultHandlerExceptionResolver로 넘어간다.
9. Spring 에서 기본으로 설정된 BasicErrorController에서 예외 처리 및 응답을 생성한다.
10. 클라이언트로 응답을 반환한다.
아주 복잡한 과정을 통해 예외를 처리하는 것 같지만, 의외로 매우 간단하다.
- 사용자가 핸들러를 등록했는가? -> 등록한 핸들러로 예외처리
- 그렇지 않다 -> 기본 핸들러로 예외처리
이렇게보면, 어차피 기본적으로 spring boot 에서 예외처리를 해주는데 무엇이 문제인가 싶은 의문이 든다.
다음은, 스프링부트에서 기본적으로 제공해주는 예외 응답에 대한 포맷을 확인해보자.
{
"timestamp": "2024-08-12T12:34:56.789+00:00",
"status": 500,
"error": "Internal Server Error",
"message": "Cannot invoke \"String.toString()\" because \"str\" is null",
"path": "/null-pointer"
}
이런식으로, 응답이 오게 되는데 불필요한 내용들이 들어있고, 특히 에러 메세지는 클라이언트 요청과는 상관없는 서버 내부 에러이기 때문에 사용할 수 없는 경우가 대다수이게 될 것이다.
이러한, 한계때문에 보통 spring boot에서 예외처리를 할 때 @ControllerAdvice나 @Handler를 직접등록하여 예외처리와 해당 응답을 직접 생성하도록 설정한다.
다음 글에서는, 예외처리 방법 중 하나에 대한 예시를 보고 해당 방법의 장단점을 알아보도록 하자.
'Web > Spring Boot 예외 처리' 카테고리의 다른 글
[Spring Boot] 예외 처리 라이브러리 만들기 (3) (0) | 2024.08.13 |
---|---|
[Spring Boot] 예외 처리 라이브러리 만들기 (2) (0) | 2024.08.13 |