본문 바로가기

Tech/Spring | SpringBoot

[SpringBoot] 예외처리 - 2 (HandlerExceptionResolver)

반응형

1. HandlerExceptionResolver

Spring 에서 예외처리를 위해서 HandlerExceptionResolver 인터페이스를 작성하고 이를 구현한 구현체를 사용한다.

 

Spring 은 에러 처리와 메인 로직을 분리하기 위해 노력하였고, 예외 처리 전략을 추상화한 HandlerExceptionResolver 인터페이스를 만들었다. 대부분의 HandlerExecptionResolver 는 try-catch 와 같이 Exception 을 catch 하고 HTTP 상태코드나 응답 메시지를 설정한다. 그렇기 때문에 WAS 입장에서는 해당 요청이 에러가 아닌 정상적인 응답으로 인식되어서 BasicExceptionController 로 에러처리 요청을 보내지 않고 바로 응답으로 전달되게된다.

 

예외가 발생하면 DispatcherServlet 까지 전달되는데, 적합한 예외 처리를 위하여 HandlerExceptionResolver 인터페이스를 구현한 구현체들을 빈으로 등록하여 관리한다. 그리고 적용 가능한 구현체를 찾아서 예외 처리를 하도록 하는데, 우선순위대로 나열하면 다음과 같다.

 

1. DefaultErrorAttributes
2. ExceptionHandlerExceptionResolver
3. ResponseStatusExceptionResolver
4. DefaultHandlerExceptionResolver

 

위의 4가지 구현체들이 빈으로 등록되어 있다. 스프링의 빈으로 등록된 Resolver 들은 예외가 발생하면 순차적으로 실행되며, 해당 Resolver 가 예외를 처리할 수 없는 경우 다음 Resolver 로 예외가 넘어간다. 마지막 Resolver 까지 확인했는데 예외에 해당하는 Resolver 가 없는 경우 최종적으로 BasicErrorController 로 에러가 넘어가서 처리가 된다.

- DefaultErrorAttributes

에러가 발생했을 때, 에러 속성을 저장하며 직접 예외를 처리하지는 않는다.

- ExceptionHandlerExceptionResolver

Spring 3.1 에서 도입된 resolver 로 기본적으로 DispatcherServlet 에서 사용 가능하다.

에러 대응을 위해 @Controller 나 @ControllerAdvice 에 있는 @ExceptionHandler 의 구현 내용을 사용하여 예외를 처리한다.

- ResponseStatusHandlerExceptionResolver

Spring 3.0 에서 도입된 resolver 로 기본적으로 DispatcherServlet 에서 사용 가능하다.

 

주로 사용자가 정의한 예외에 대한 @ResponseStatus 어노테이션을 처리한다. 이 예외들을 HTTP 상태 코드와 매핑하는 역할을 한다. Response 의 HTTP 상태 코드는 매핑된 상태코드로 정의할 수 있지만, body 는 지정할 수 없기 때문에 Response 의 body 는 null 이라는 제약이 있다.

- DefaultHandlerExceptionResolver

Spring 3.0 에서 도입된 resolver 로 기본적으로 DispatcherServlet 에서 사용 가능하다. Spring 표준 예외들을 처리하는 resolver 이다. 해당 예외들을 대칭되는 HTTP 상태 코드로 매핑하여 처리한다.

 

Response 의 HTTP 상태 코드는 매핑된 상태코드로 정의할 수 있지만, body 는 지정할 수 없기 때문에 Response 의 body 는 null 이라는 제약이 있다. 이러한 제약사항을 해결하기 위하여 ModelAndView 를 사용하여 view 에 에러 내용을 출력하는 방법이 있지만 바람직한 방법이 아니기 때문에 Spring 3.2 에서는 더 나은 옵션을 제공한다. 이 내용은 추후에 다룬다.

2. 예외처리 기능

ExceptionResolver 를 동작시키기 위해서는 다양한 예외 처리 기능들을 사용해야 한다. 대표적인 예로 @ExceptionHandler 이나 @ResponseStatus 와 같은 어노테이션들이 있고 ResponseStatusException 클래스도 있다. 이들을 사용하여 예외 처리 내용을 구현하면 Exception Resolver 에서는 해당 구현 내용을 통해서 예외를 처리한다. 해당 기능들에 대한 자세한 내용은 추후에 추가로 작성한다.

[Reference]

 

[Spring] 스프링의 다양한 예외 처리 방법(ExceptionHandler, ControllerAdvice 등) 완벽하게 이해하기 - (1/2)

예외 처리는 애플리케이션을 만드는데 매우 중요한 부분을 차지한다. Spring 프레임워크는 매우 다양한 에러 처리 방법을 제공하는데, 어떠한 방법들이 있고 가장 좋은 방법(Best Practice)은 무엇인

mangkyu.tistory.com

 

반응형