스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ExceptionHandler 우선순위
ExceptionResolver의 우선순위가 왜 ExceptionHandlerExceptionReosolver, ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver의 순서로 되어잇는지 코드를 확인해봤습니다.
ExceptionResolver의 우선 순위를 확인할 수 있는 코드는 아래와 같습니다. WebMvcConfigurationSupport 클래스에 addDefaultHandlerExceptionResolvers 메소드는 아래처럼 정의되어 있습니다.
protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers, ContentNegotiationManager mvcContentNegotiationManager) { ExceptionHandlerExceptionResolver exceptionHandlerResolver = createExceptionHandlerExceptionResolver(); exceptionHandlerResolver.setContentNegotiationManager(mvcContentNegotiationManager); exceptionHandlerResolver.setMessageConverters(getMessageConverters()); exceptionHandlerResolver.setCustomArgumentResolvers(getArgumentResolvers()); exceptionHandlerResolver.setCustomReturnValueHandlers(getReturnValueHandlers()); if (jackson2Present) { exceptionHandlerResolver.setResponseBodyAdvice( Collections.singletonList(new JsonViewResponseBodyAdvice())); } if (this.applicationContext != null) { exceptionHandlerResolver.setApplicationContext(this.applicationContext); } exceptionHandlerResolver.afterPropertiesSet(); exceptionResolvers.add(exceptionHandlerResolver); ResponseStatusExceptionResolver responseStatusResolver = new ResponseStatusExceptionResolver(); responseStatusResolver.setMessageSource(this.applicationContext); exceptionResolvers.add(responseStatusResolver); exceptionResolvers.add(new DefaultHandlerExceptionResolver());}
위의 빨간색으로 표시한 순서대로 List에 add를 하고,
나중에 DispatcherServlet의 processExceptionHandler 메소드에서 List를 순회하기 때문에 이 우선순위대로 동작한다고 이해하시면 좋을 것 같습니다.
당연히 많이들 아시는 내용이고 간단한 내용이라 글 쓰는게 맞나. 부담스러운 부분도 있지만, 저처럼 모르시는 분들을 위해 글써봤습니다.