예외처리 흐름도
- 기본적인 Exception 흐름도
- Controller에서 Exception 발생
- Tomcat으로 전달
- 에러 코드 별로, 지정된 Mapping으로 다시 Controller로 전달
- 전달된 페이지를 View
예외처리 방법
1. Exception을 직접 구현하여, mapping Controller로 진행
2. Spring이 자동으로, 에러코드별 html이 있다면 해당 html로 view 진행
3. API형식일 경우, json 형태로 (혹은 다른 방식으로) 에러 코드 및 메시지 전달
- 현재 프로젝트에 적용되어 있는 Exception 방식
- 1번 방법으로, Exception을 직접 구현하여 원하는 Html로 맵핑 작업
예외처리 구현
- WebServerFactoryCustomizer를 통한 구현 (@Override customize())
- /errors/custom 하위에 에러코드에 맞는 페이지 구현
@Component
public class CustomExceptionPage implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/errors/custom/404");
ErrorPage errorPage502 = new ErrorPage(HttpStatus.BAD_GATEWAY, "/errors/custom/502");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/errors/custom/500");
ErrorPage errorPageEx500 = new ErrorPage(RuntimeException.class, "/errors/custom/500");
factory.addErrorPages(errorPage404,errorPage500, errorPage502, errorPageEx500);
}
}
@Controller
@RequestMapping(value="/errors/custom")
@Slf4j
public class ExceptionPageController {
@GetMapping("500")
public String error500(HttpServletRequest request, HttpServletResponse response){
return "errors/custom/500";
}
@GetMapping("502")
public String error502(HttpServletRequest request, HttpServletResponse response){
return "errors/custom/502";
}
@GetMapping("404")
public String error404(HttpServletRequest request, HttpServletResponse response){
return "errors/custom/404";
}
}
참고)
- spring 으로 Exception을 처리할경우 "/template/errors" 하위에 5xx.html 같이 만들어 두면 spring이 해당 에러코드가 나올시 자동으로 맵핑해줌
- API의 경우, 직접 정의하여 Exception처리를 진행해야함 (코드값 , msg) -> AOP를 사용하면 편리해보임
아쉬운점
- API의 경우 Exception을 처리하지 못한점이 아쉽다
- Exception을 직접 구현하다보니, 자주 발생할 수 있는 에러코드만 구현하게 되었다 (다른 종류의 에러코드도 구현을 추가하거나, spring의 예외처리를 채택을 해야할거같다)