스프링의 기본 에러 처리인 BasicErrorController가 /error까지. 즉 예외가 발생해서 서블릿을 넘어 WAS까지 전달되면 우리가 지금까지 배운 개념으로는 서버내부의 에러이므로 무조건 500에러를 반환한다! 발생하는 예외에 따라서 400, 404 등 상태코드도 다르게 설정하고 오류메시지, 형식 등을 API별로 다르게 하고싶은데…! 어떻게 해야할까!
지금까지도 클라에서 넘어오는 매개변수 형식이 잘못되면, 즉 IllegalArgumentException이 터진다면 그냥 500에러가 터지면서 뭐가 문제인지 정확하게 클라에서는 모를 것이다! → 400으로 주는 것이 맞을텐데..!
아래 코드에서 url이 "/api/members/bad" 인 경우에는 bad request에 해당하는 400에러를 반환해주고 싶다! 근데 어떻게..?!
    @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("잘못된 입력 값");
        }
        if (id.equals("user-ex")) {
            throw new UserException("사용자 오류");
        }
        return new MemberDto(id, "hello " + id);
    }
여기서 HandlerExceptionResolver의 개념이 등장한다!
아래 그림은 ExceptionResolver 적용전 서블릿을 넘어서는 예외가 발생했을 때의 에러가 WAS로 전달되어 무조건 500에러를 반환하는 그림이다.

아래그림은 ExceptionResolver 적용후의 그림이다. 컨트롤러에서 발생한 IllegalArgumentException(3,4번)을 WAS로 던지기전에 ExceptionResolver가 적용(5번)되어 에러를 이쁘게 만들어주는(ㅋㅋ) 것이다.

이쁘게 만들어준다는 것이 이해가 잘 안될테니 코드와 함께 봐보자.
먼저 인터페이스다. ModelAndView를 반환중이다!
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex);
}
아래는 구현체이다!
@Slf4j
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        log.info("call resolver", ex);
        try {
            if (ex instanceof IllegalArgumentException) {
                log.info("IllegalArgumentException resolver to 400");
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
                return new ModelAndView(); // 400임
            }
        } catch (IOException e) {
            log.error("resolver ex", e);
        }
        return null;
    }
}