Spring에서 예외 핸들링 중 특정 예외에서 어떤 경우에는 json으로 응답하고 어떤 경우에는 유저에게 에러 페이지를 보여줘야하는 경우가 존재합니다.
이런 경우 간단히 처리하는 예제 소스입니다.(더 좋은 방법이 있을 수 있지만 고민이 필요)
/**
* 최상위 예외(Exception) 처리
* - 에러로그를 남겨서 담당자에게 이메일 발송(logback에 설정 됨)하여 알 수 있도록 하기 위함
* - 유저에게 에러 페이지를 보여주기 위해서 ModelAndViewDefiningException를 사용(DispatcherServlet에서 view 처리됨)
*
* @param ex
* @return
*/
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> RootException(Exception ex) throws ModelAndViewDefiningException {
errorLog("RootException", ex);
log.debug("exception class ===> {}", ex.getClass().getSimpleName());
if (CommonUtil.isAjaxReq(HttpRequestUtil.getCurrentRequest())) { //ajax라면 json으로 응답
RtnVO rtnVO = new RtnVO();
rtnVO.setErrorCd(ErrorCd.SYSTEM_ERROR.name());
rtnVO.setMsg("서버 에러가 발생했습니다. 담당자에게 문의하세요");
return new ResponseEntity<>(rtnVO, ErrorCd.SYSTEM_ERROR.getStatus());
}
ModelAndView mav = new ModelAndView();
mav.setViewName("forward:/error/serverError"); //ajax 요청이 아니라면 유저에게 에러메시지 페이지를 보여줌(/error/serverError는 에러 페이지 랜더링용 공용 URL)
throw new ModelAndViewDefiningException(mav);
}
참고로 DispatcherServlet.java에서 ModelAndViewDefiningException 처리가 되어있다.
'JAVA > Spring 일반' 카테고리의 다른 글
JPA N+1 문제 해결과 관련 Spring Data JDBC에서 기능 추가 예정과 관련 (0) | 2023.09.01 |
---|---|
spring custom valid 어노테이션으로 업로드 파일의 확장자 및 유효성 검사 (0) | 2023.07.31 |
mysql + mybatis + Spring 조합에서 데이터 존재하는지 판다는하는 소스와 쿼리(성능 감안) (0) | 2022.04.08 |
자주 사용하는 Spring valid관련 내용들 - 메모 (0) | 2022.04.05 |
logback file appender 설정 (0) | 2021.08.26 |