404(NotFound) 에 대한 Exception 처리

Eaden·2020년 7월 5일
0
post-thumbnail

이슈

  • ControllerAdvice 를 정의하여 전역 Exception 처리하는 상황
  • 정의되지 않은 url 에 대해 Dispatcher Servlet 에서 Exception 이 발생하지 않고 Interceptor 로직을 타게됨
  • Interceptor 에서 Exception 발생시 ControllerAdvice 에서 핸들링되지 않고 500에러 발생

관련 내용

  • 404(NotFound) 에 대해서는 기본적으로 Dispatcher Servlet 에서 핸들링하여 에러를 응답함
  • 따라서 위 Spring 구조상 404 상황에서 Interceptor 가 실행되는게 이상한 상황

해결

  • 404 에 대한 NoHandlerFoundException 를 직접 처리하기 위한 설정
    • application.properties
      spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
    • ControllerAdvice 에 NoHandlerFoundException 핸들러 구현
    • 특이사항
      • NoHandlerFoundException 을 직접 핸들링한 이후 404 상황에서 Interceptor 가 실행되는 일이 없어짐
  • 404 핸들링 설정 이후 Swagger 에서 문제 발생시
    아래와 같이 swagger-ui 의 리소스 위치를 지정
@Configuration 
@EnableSwagger2

public class SwaggerConfig extends WebMvcConfiguarationSupport { 

	@Override 
	protected void addResourceHandlers(ResourceHandlerRegistry registry) { 
		registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); 
		registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); 
	} 
	... 
}
  • https://yonguri.tistory.com/87
  • DispatcherServlet 을 통해 응답되는 에러메시지도 응답 규격에 맞추도록 수정
    • DefaultErrorAttributes 를 상속받아, 내가 정의한 응답 규격에 맞게 변환


참조

https://supawer0728.github.io/2019/04/04/spring-error-handling/

profile
일단 기록하자!!!

0개의 댓글