기존에 했던 방법은 예외가 발생해서 WAS까지 전달될 경우에 예외의 종류에 상관없이 500 에러가 발생하였다. 이제 예외에 따라 400, 404등 다른 에러로 처리를 해보자.
@GetMapping("/api/members/{id}")
public MemberDto getMember(@PathVariable("id") String id) {
if (id.equals("ex")) {
throw new RuntimeException("잘못된 사용자");
}
if (id.equals("bad")) {
throw new IllegalArgumentException("잘못된 입력 값");
}
return new MemberDto(id, "hello" + id);
}
1. 인터셉터 preHandle 수행
2. 핸들러 실행
3. 예외 발생
4. Dispatcher Servlet으로 예외 전달
5. ExceptionResolver가 예외 해결 시도
ModelAndView반환
6. (정상 호출 시) view 반환
7. (예외 발생 시) afterCompletion 수행
8. 정상 응답
@Slf4j
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
try {
if (ex instanceof IllegalArgumentException) {
log.info("IllegalArgumentException resolver");
response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
return new ModelAndView();
}
} catch (IOException e) {
log.error("resolver ex", e);
}
return null;
}
}
이제 ExceptionResolver를 등록해주자
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 생략
// HandlerExceptionResolver 추가
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(new MyHandlerExceptionResolver());
}
// 생략
해당 설정에서는 extendHandlerExceptionResolvers를 오버라이드 하고 있는데 이 메서드는 스프링 기본 ExceptionResolver에 내가 생성한 ExceptionResolver를 추가하는 메서드다.
configureHandlerExceptionResolvers를 오버라이드할 경우 스프링 기본 ExceptionResolver가 제거되므로 주의하자!!!
이제 다시 결과를 확인해보면
400에러가 발생한 것을 확인할 수 있다!!!
이걸로 기본적인 ExceptionResolver 사용법에 대해서 알아보았다. 다름 포스팅에서는 ExceptionResolver의 활용 방법에 대해서 알아보자!!!
출처 : 김영한 스프링MVC2편