본문 바로가기

[Spring] Servlet에서 예외 처리는 어떻게 진행 될까?

민이(MInE) 2024. 4. 28.
반응형

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 | 김영한 - 인프런

김영한 | 웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습

www.inflearn.com

본 글은 인프런의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 작성되었습니다~

 

 

Spring Boot 로 오류 페이지를 작성하기에 앞서 Servlet이 예외 처리를 어떻게 하는지 알아보려고 합니다.

 

기본적으로 Servlet은 Exception과 sendError로 예외 처리를 진행합니다.

 

Exception

웹 애플리케이션에서 예외 발생시 예외를 try-catch로 잡지 못하고, Servlet 밖으로 전달된다면 아래와 같이 동작합니다.

 

컨트롤러에서 예외발생 -> 인터셉터 -> 서블릿 -> 필터 -> 최종적으로 WAS 까지 전달 !!

 

application.properties에 Spring Boot가 기본적으로 제공하는 예외 페이지를 지우기 위해 아래 코드를 작성해줍니다.

 

server.error.whitelabel.enabled=false

 

 

localhost:8080/404 를 호출하면 톰캣이 기본적으로 제공하는 오류 페이지가 아래와 같이 올라옵니다.

 

 

 

response.sendError

 

다음은 HttpServletResponse이 제공하는 sendError라는 메서드입니다. sendError의 사용법은 아래와 같습니다.

sendError(Http 상태 코드)
sendError(Http 상태 코드, 오류 메시지)

 

sendError는 아래와 같이 동작합니다

 

컨트롤러 -> 인터셉터 -> 서블릿 -> 필터 -> WAS에서 sendError 호출 기록 확인 !!

 

 

 

오류 페이지

 

이제 예외 처리 방법을 알아보았으니 Servlet이 제공하는 오류 페이지를 사용해 보겠습니다. 기본적으로 오류 페이지 처리는 아래와 같이 해줄 수 있습니다.

 

@Component
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
    @Override
    public void customize(ConfigurableWebServerFactory factory) {
        ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404");
        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);
    }
}

 

 

그리고 오류가 발생했을 때 처리해줄 수 있는 컨트롤러가 필요하기 때문에 컨트롤러도 만들어줍니다 !

@Slf4j
@Controller
public class ErrorPageController {
 	@RequestMapping("/error-page/404")
 	public String errorPage404(HttpServletRequest request, HttpServletResponse response) {
 		log.info("errorPage 404");
 		return "error-page/404";
 	} 
    @RequestMapping("/error-page/500")
 	public String errorPage500(HttpServletRequest request, HttpServletResponse response) {
 		log.info("errorPage 500");
 		return "error-page/500";
 	}
}

 

그리고 뷰를 만들어주면 !!

 

 

 

이렇게 오류 페이지를 수정해줄 수 있습니다 ~ 위 과정의 흐름은 아래와 같습니다

 

WAS `/error-page/404` 다시 요청 -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러(/error-page/404) -> View

 

1. WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
2. WAS `/error-page/404` 다시 요청 -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러(/error-page/404) -> View

 

예외 발생 시 WAS 까지 전달되고 WAS는 오류 페이지를 호출할 때 필터, 서블릿, 인터셉터, 컨틀롤러도 다시 호출시킵니다.

 

 

여기까지 Servlet 이 예외 처리를 하는 흐름에 대해서 이해해보았습니다.

반응형

댓글