ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 예외 처리와 오류 페이지
    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
Designed by Tistory.