본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : HandlerExceptionResolver 활용하기

by 오주현 2022. 3. 5.
반응형

HandlerExceptionResolver 활용하기

예외 발생 → WAS → 오류 페이지 찾는다 → 다시 /error 호출 이 과정은 복잡하다. ExceptionResolver를 통해 예외가 발생했을 때 깔끔하게 해결이 가능하다.

 

if (id.equals("user-ex")) {
 throw new UserException("사용자 오류");
 }

ApiExceptionController에 user-ex에 대한 코드를 넣어주어 호출 시 UserException이 발생하도록 했다.

 

try {
        if (ex instanceof UserException) {
            log.info("UserException resolver to 400");
            String acceptHeader = request.getHeader("accept");
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

            if ("application/json".equals(acceptHeader)) {
                Map<String, Object> errorResult = new HashMap<>();
                errorResult.put("ex", ex.getClass());
                errorResult.put("message", ex.getMessage());

                // json을 문자로 바꿔준다.
                String result = objectMapper.writeValueAsString(errorResult);

                response.setContentType("application/json");
                response.setCharacterEncoding("utf-8");
                response.getWriter().write(result);
                return new ModelAndView();
            } else {
                //TEXT/HTML
                return new ModelAndView("error/500");
            }
        }

    } catch (IOException e) {
        log.error("resolver ex", e);
    }

    return null;
}

HTTP 요청 헤더의 ACCEPT 값이 application/json 이면 json 오류로 나타내고 그 외는 html 오류페이지를 보여준다. 중간에 objectMapper로 json을 문자로 바꾸게 해줬다.

 

이렇게 하면 ExceptionResolver를 통해 컨트롤러에서 발생하는 예외를 처리해버려 서블릿 컨테이너까지 예외가 전달되지 않아 WAS 입장에서는 편해졌다.


스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.

반응형

댓글