서블릿 예외 처리

wangjh789·2022년 8월 10일
0

[Spring] 스프링-mvc-2

목록 보기
9/11

서블릿의 예외 처리 방식

  • Excpetion
    웹 어플리케이션은 사용자의 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행
    만약 앱 내에서 예외를 못 잡고 서블릿 밖으로 예외가 전달되면? -> 500 에러
WAS <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러 (예외발생)
	@GetMapping("/error-ex")
    public void errorEx() {
        throw new RuntimeException("예외 발생");
    }
  • response.sendError(SatusCode, errMsg)
    sendError()를 호출한다고 해도 바로 예외가 발생하는 것은 아니지만 서블릿 컨테이너에게 오류가 발생핬다는 사실을 전달할 수 있다.
    Expetion과 다르게 오류코드를 지정할 수 있다.
WAS(sendError 호출 기록 확인) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러 (response.sendError())
	@GetMapping("/error-404")
    public void error404(HttpServletResponse response) throws IOException {
        response.sendError(404,"404 오류!");
    }
    @GetMapping("/error-500")
    public void error500(HttpServletResponse response) throws IOException {
        response.sendError(500,"500 오류!");
    }

스프링 에러 페이지

WebServerFactoryCustomizer<ConfigurableWebServerFactory> 를 상속받아 수동으로 에러가 발생했을 때의 호출할 url을 지정할 수 있다.

@Component
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
    @Override
    public void customize(ConfigurableWebServerFactory factory) {

        ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/400");
        ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-page/500");

        ErrorPage errorPageEx = new ErrorPage(RuntimeException.class, "/error-page/500");

        factory.addErrorPages(errorPage404,errorPage500,errorPageEx);

    }
}

컨트롤러에서 에러가 발생하면 서블릿 컨테이너까지 전달되고, 에러 종류에 따라 위에서 지정한 url로 다시 요청한다.
그렇기때문에 필터, 서블릿, 인터셉터 컨트롤러의 과정을 다시 거치게 된다.
이 과정에서 WAS는 단순히 다시 요청만 하는게 아니라 오류정보를 request의 attribute에 추가한다.

profile
기록

0개의 댓글