728x90
반응형
예외 처리 이론 및 기초
- 웹애플리케이션에서 예외처리를 알아보자.
웹 애플리케이션
- 웹애플리케이션은 사용자 요청이 오면 별도의 쓰레드로 각각 실행이 된다.
- 웹애플리케이션에서 예외를 처리하지 못하고 서블릿 밖으로 전달 되면 어떻게 되는지 보자
서블릿에서 예외 처리 방식 및 흐름
- 서블릿에서 예외가 발생하면 다음과 같은 방식으로 진행이 된다.
1 번: 일반 요청이 들어와 컨트롤러까지간다.
2 번: 익셉션이 터지고 예외로 잡지 않으면 WAS 까지 전달이 된다.
3 번: 해당 에러가 어떤건지 확인하고 에러 페이지를 보여주기 위해 다시 컨트롤러까지 간다.
문제점
- 불필요한 호출이 발생 한다.
- 예외가 발생하면 다시 오류페이지를 찾기 위해 인터셉터 서블릿을 거치게 된다.
- 매우 비효율 적이다.
비효율적인 이유는 이미 처리를 했는데 한번더 처리가 되기 때문이다.
Filter, Interceptor의 불필요한 호출을 처리하는 법
Filter
- DispatchType 에 따라 들어온 요청 구별 할 수 있다.
REQUEST: 클라이언트 요청
ERROR : 오류 요청
FORWARD: 서블릿 에서 다른 서블릿을 요청 할 경우
INCLUDE: 서블릿에서 다른 서블릿이나 JSP의 결과를 포함할때
ASYNC : 서블릿 비동기 호출
- 아래 처럼 setDispatcherTypes 를 이용하여 요청에 따라 호출할 타입을 지정 할 수 있다.
public FilterRegistrationBean logFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean
= new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR);
return filterRegistrationBean;
}
Interceptor
- 인터셉터는 서블릿이 제공하는 기능이 아니기 때문에 DispatcherType 을 쓸수 없다.
- excludePathPatterns 를 이용하여 경로를 제거한다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "/*.ico", "/error", "/error-page/**" //오류 페이지 경로
);
}
스프링 부트의 오류 페이지
- 서블릿에서 예외 처리 페이지를 만들기 위해
- WebServerCustomizerd를 만든다.
- 예외 종류에 따라 HTML 을 추가 해야 된다.
- ErrorPageController 를 만들어서 예외를 따로 처리 해야된다.
BasicErrorController
- 스프링은 위 과정을 자동으로 처리 해준다.
- BasicErrorController 에서 처리를 해주기 때문이다.
- 개발자는 그냥 페이지만 등록 해주면 된다.
View Template
- resource/templates/error/500.html
- resource/templates/error/5xx.html
static resource
- resources/static/error/400.html
- resources/static/error/4xx.html
- resources/static/error/404.html
참고:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2
728x90
반응형
'Spring > spring mvc 2 스터디' 카테고리의 다른 글
[Spring] API 예외 처리(ExceptionResolver) (0) | 2022.07.02 |
---|---|
[Spring] API 예외 처리(HandlerExceptionResolver) (0) | 2022.06.26 |
[Spring] Filter Vs Interceptor (0) | 2022.06.01 |
[Spring] Interceptor (0) | 2022.06.01 |
[Spring] Filter (0) | 2022.05.31 |
댓글