[SpringBoot] 예외처리 핸들링 (1) - 예외처리와 오류 페이지

해니·2024년 9월 25일
0

SpringBoot

목록 보기
18/24
post-thumbnail

예외처리 핸들링 하려면..? 🧐

파라미터 유효성 검사 기능 개발 중, HttpMessageNotReadableException을 핸들링 하는 방법을 찾던 중 HandlerExceptionResolver을 구현하게 되었는데, 관련 내용을 정리해 두려고 한다. 1편은 예외처리와 오류 페이지 , 2편은 API 예외처리 방식을 포스팅 할 예정이다.



서블릿의 예외 처리 방식

  • 서블릿은 크게 두 가지 방식으로 예외 처리를 지원한다.
    • Exception (예외)
    • response.sendError(HTTP 상태 코드, 오류 메시지)

Exception (예외)

  • 컨트롤러에서 예외 발생 후, 서블릿 밖으로 빠져나오면 WAS가 이 예외를 받게 된다.
  • WAS는 미리 만들어둔 예외 페이지가 존재한다면 그 페이지 URL로 다시 요청 메세지를 보내고, 그 외에는 톰캣이 기본으로 제공하는 오류 페이지에 HTTP 상태 코드 500으로 응답을 보낸다.



response.sendError()

  • 오류가 발생했을 때 HttpServletResponse 가 제공하는 sendError 라는 메서드를 사용할 수 있다.



오류 페이지 등록

import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

@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);
    }
}
  • WebServerFactoryCustomizer로 오류 페이지를 등록할 수 있다.
  • ErrorPage errorPage = new ErrorPage(Http 상태코드, 오류페이지 경로): response.sendError()에 설정한 상태코드를 받는다.
  • ErrorPage errorPage = new ErrorPage(Exception.class, 오류페이지 경로): 발생한 예외 및 그 자식 예외 클래스를 받는다.



✅ 스프링 부트는 whitelabel이라는 자체 오류페이지를 제공하기 때문에 톰캣이 제공하는 오류 페이지를 보려면 resource/application.properties에 아래 코드를 추가시켜줘야한다.

server.error.whitelabel.enabled=false



오류 페이지 컨트롤러

  • 오류 페이지 등록 후, 예외가 발생하면 WAS는 지정해둔 URL로 일반적인 페이지 요청 신호를 보내기 때문에 이를 받을 컨트롤러가 필요하다.
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@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";
	}
}



DispatcherType

  • 컨트롤러에서 예외가 발생하여 WAS까지 전파되고, 에러 페이지를 출력하기 위해 WAS가 다시 에러 페이지 URL을 요청하는 과정에서 매번 필터와 인터셉터가 호출된다. (비효율적)
  • 서블릿은 DispatcherType이라는 추가 정보를 제공하여, 클라이언트로 부터 발생한 정상 요청인지, 아니면 오류 페이지를 출력하기 위한 내부 요청인지 구분할 수 있게 해준다.
    @Bean
    public FilterRegistrationBean logFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
        filterRegistrationBean.setFilter(new LogFilter());
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR);
        return filterRegistrationBean;
    }






출처

스프링 부트 API 예외 처리 [2] HandlerExceptionResolver
ExceptionResolver를 이용한 API예외 처리
HandlerExceptionResolver - API 예외처리
API 예외 처리 (1) - MediaType, ExceptionResolver
스프링 예외 처리와 오류 페이지
[Spring] 예외 처리(BasicErrorController, HandlerExceptionResolver)
Servlet - 예외처리와 오류 페이지 (Exception)
[Spring] 톰캣(servlet) 에러페이지가 아닌 whitelabel Error Page가 뜨는 이유

profile
💻 ⚾️ 🐻

0개의 댓글