-
예외 처리와 오류 페이지Java/SpringBoot 2022. 8. 18. 16:28
서블릿 예외 처리
서블릿이 예외 처리하는 방식:
1. Exception
2. response.sendError(Http code, error message)
WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
package hello.exception.servlet; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Slf4j @Controller public class ServletExController { @GetMapping("/error-ex") public void errorEx() { throw new RuntimeException("예외 발생!"); } }
위와 같이 예외를 발생시킬 수 있다.
오류 페이지의 작동 원리
response.sendError() 가 호출되었을때
예외가 발생해 was까지 전달되면 해당 예외를 처리하는 오류페이지 정보를 확인한다.
그리고 오류 페이지를 처리하기 위해 해당 url을 다시 요청한다.
오류 정보 추가: WAS는 단순히 오류 페이지만 요청하는게 아니라 오류 정보를 request의 attribute에 넣어준다. 오류페이지에서 이 정보를 사용할 수 있다.
javax.servlet.error.exception : 예외
javax.servlet.error.exception_type : 예외 타입
javax.servlet.error.message : 오류 메시지
javax.servlet.error.request_uri : 클라이언트 요청 URI
javax.servlet.error.servlet_name : 오류가 발생한 서블릿 이름
javax.servlet.error.status_code : HTTP 상태 코드서블릿 예외 처리 - 인터셉터
package hello.exception.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.UUID; @Slf4j public class LogInterceptor implements HandlerInterceptor { public static final String LOG_ID = "logId"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); String uuid = UUID.randomUUID().toString(); request.setAttribute(LOG_ID, uuid); log.info("REQUEST [{}][{}][{}][{}]", uuid, request.getDispatcherType(), requestURI, handler); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("postHandle [{}]", modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { String requestURI = request.getRequestURI(); String logId = (String)request.getAttribute(LOG_ID); log.info("RESPONSE [{}][{}][{}]", logId, request.getDispatcherType(), requestURI); if (ex != null) { log.error("afterCompletion error!!", ex); } } }
WebConfig
package hello.exception; import hello.exception.filter.LogFilter; import hello.exception.interceptor.LogInterceptor; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.DispatcherType; import javax.servlet.Filter; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) .order(1) .addPathPatterns("/**") .excludePathPatterns("/css/**", "/*.ico", "/error", "/error-page/**" //오류 페이지 경로); } }
- /error-ex 오류 요청
- 필터는 DispatchType 으로 중복 호출 제거 ( dispatchType=REQUEST )
- 인터셉터는 경로 정보로 중복 호출 제거( excludePathPatterns("/error-page/**") )
1. WAS(/error-ex, dispatchType=REQUEST) -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러
2. WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
3. WAS 오류 페이지 확인
4. WAS(/error-page/500, dispatchType=ERROR) -> 필터(x) -> 서블릿 -> 인터셉터(x) -> 컨트롤러(/error-page/500) -> View'Java > SpringBoot' 카테고리의 다른 글
API 예외 처리 (0) 2022.08.18 파일 업로드 (0) 2022.08.18 타입 컨버터 (0) 2022.08.18 의존성 주입 Dependency Injection. DI (0) 2021.02.24 [Thymeleaf] 문법 정리 (0) 2021.01.18