티스토리 뷰
예외 페이지..
서블릿 예외처리
- 과정
1. HTTP 요청 -> WAS -> Filter -> Servlet -> Interceptor -> Controller
2. Controller 예외 발생!
3. Controller -> Interceptor -> Servlet -> Filter -> WAS
4. WAS(error처리 페이지) -> Filter -> Servlet -> Interceptor -> Controller
5. Controller(오류처리) -> Interceptor -> Servlet -> Filter -> WAS -> HTTP 응답
- 위의 방식대로, 정상적인 요청에서 예외발생시 해당 예외처리를 WAS에서 한번 더 재요청하게 된다
- 해당 부분을 생각하여, 예외처리를 위한 등록과정 과 예외처리용 Controller가 필요하다
서블릿 예외처리 등록 및 Controller
@FunctionalInterface
public interface WebServerFactoryCustomizer<T extends WebServerFactory> {
void customize(T factory);
}
- WebServerFactoryCustomizer를 이용하여, Http 상태 또는 Exception 종류에 따른 예외 페이징 처리를 한다.
- WAS에서 해당 오류에 따른 요청을 할때에, 등록되어있는 구분에 따라 재요청이 이루어지게 된다
Exception에 따른 등록
@Component
public class MyCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404");
ErrorPage errorPageException = new ErrorPage(RuntimeException.class, "/error-page/500");
factory.addErrorPages(errorPage404, errorPageException);
}
}
Exception 처리 Controller
@Controller
@Slf4j
public class ErrorPageController{
@RequestMapping("/error-page/404")
public String errorPage404(HttpServletRequest request, HttpServletResponse response){
log.info("error 404");
return "error-page/404";
}
@RequestMapping("/error-page/500")
public String errorPage404(HttpServletRequest request, HttpServletResponse response){
log.info("error 500");
return "error-page/500";
}
- /templates/error-page/404.html
- /templates/error-page/500.html
Spring boot 예외처리 적용
- spring boot 는 자동으로 ErrorPage를 등록
- BasicErrorController를 spring boo는 자동으로 등록
- 개발자의 경우, error page만 지정된 경로에 저장해주면 됨 ( /templates/error/** )
- 4xx로 만든다면, 해당 400번대 오류의 경우 해당 html을 view 해줌
- 404.html 처럼 특정 오류에 대한 페이지의 경우 우선적으로 html을 view 해줌
/resources/templates/error/4xx.html
/resources/templates/error/404.html
/resources/templates/error/5xx.html
/resources/templates/error/500.html
- 하위 정보들을, spring boot는 기본적으로 제공함
<ul>
<li>오류 정보</li> <ul>
<li th:text="|timestamp: ${timestamp}|"></li>
<li th:text="|path: ${path}|"></li>
<li th:text="|status: ${status}|"></li>
<li th:text="|message: ${message}|"></li>
<li th:text="|error: ${error}|"></li>
<li th:text="|exception: ${exception}|"></li>
<li th:text="|errors: ${errors}|"></li>
<li th:text="|trace: ${trace}|"></li>
</ul>
</li> </ul>
- 특정 설정을 통해서 parameter혹은 설정에 따라 오류 정보를 보여줄 수 있음
[ application.properties 설정 정보 ]
server.error.include-exception=true
server.error.include-message=on_param /never / always 중 하나
server.error.include-stacktrace=on_param /never / always 중 하나
server.error.include-binding-errors=on_param /never / always 중 하나
// 테스트시 (on_param 설정)
http://localhost:8080/error-ex?message=&errors=&trace=
서블릿 예외처리 ( 필터 , 인터셉트 적용 )
Servlet Filter 적용
- LogFilter의 Filter 적용
- setDispatcherTypes() 메서드를 이용하여 ERROR인 경우에도 필터가 적용되게 설정 가능 ( 기본값 : REQUEST )
- WAS에서 예외처리를 재전송할 때에, DispatcherType은 ERROR 이다
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
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;
} }
Spring Interceptor
- Interceptor의 경우, excludePathPatterns를 이용하여 제외할 error 페이지를 지정 (해당 error페이지의 요청일 경우 인터셉트 적용 x)
- 반대로 적용하고 싶으면, 해당 부분을 제거하면 된다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/error", "/error-page/**",);
}
}
'백엔드 > SPRING MVC' 카테고리의 다른 글
Spring Type Converter (타입 형변환) (0) | 2024.10.08 |
---|---|
예외처리 (API) (0) | 2024.10.07 |
Spring Intercept (0) | 2024.10.07 |
Servlet Filter (0) | 2024.10.07 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 검증
- 게시판
- 포트폴리오
- bean
- 버블정렬
- 우선순위 큐
- 깊이우선탐색
- 오블완
- 코딩테스트
- 게시판 프로젝트
- db
- 기술면접
- 예외처리
- stack
- HTML5
- DFS
- 알고리즘
- JSON
- Spring
- 클래스
- JDBC
- SQL
- 백준
- 이진탐색
- 정렬
- BFS
- Thymeleaf
- Java
- 티스토리챌린지
- 타입변환
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함