SPRING/Spring MVC

[SpringMVC] 예외처리 ( 필터, 인터셉터 )

IT록흐 2023. 9. 1. 16:49
반응형
 

[SpringMVC] 오류페이지 띄우기 ( SpringBoot )

HTTP 요청이 들어오면 위 그림과 같은 순서로 처리가 된다. 만약 여기서 예외가 발생하면 어떻게 될까? try-catch문으로 예외를 처리하면 상관없지만 서블릿 밖으로 예외가 전파되면 예외는 WAS까지

lordofkangs.tistory.com

 

지난 포스팅에서 오류페이지가 띄워지는 원리를 살펴보았다.

 

 

 

 

에러 발생 시, try-catch문으로 예외처리가 되지 않으면 에러는 전파되어 WAS까지 전달된다. WAS는 에러코드에 맞는 적절한 에러페이지를 응답해야 한다. 지난 포스팅에서 에러페이지를 띄우기 위한 URL 요청을 다시 서블릿에게 보내도록 설정했다. 그럼 위 그림처럼 다시 WAS->필터->서블릿->인터셉터->컨트롤러로 이동한다. 

 

필터와 인터셉터는 공통관심사를 처리하기 위한 영역이다.  클라이언트로 부터 HTTP 요청이 들어오면 필요하지만 WAS가 에러페이지를 요청할 때는 굳이 필요하지 않다. 그럼에도 필터나 인터셉터는 모든 요청에 반응하도록 설정되어 있는 경우가 많아 아무 효용없이 호출되는 경우가 많다. 

 

이번 포스팅에서는 WAS가 에러페이지 요청을 할때는 필터와 인터셉터가 호출되지 않도록 설정해보겠다. 

 

 

필터(Filter)

 

필터 호출을 제외하려면 DispatcherType에 대해서 알아야 한다. 

 

DispatcherType은 요청의 종류를 열거형(Enum)으로 표현한 것이다. 서블릿은 요청의 종류에 따라  적절한 방식으로 서블릿을 호출하기 위해, 요청의 종류를 열거형 상수로 제공한다. 

 

REQUEST : 클라이언트 요청

ERROR : 오류 요청

FORWARD : 서블릿에서 다른 서블릿 호출, 서블릿에서 JSP 호출

INCLUDE : 서블릿에서 다른 서블릿이나 JSP 결과 포함

ASYNC : 서블릿 비동기 호출

 

WAS가 오류페이지를 요청할때는 ERROR 타입으로 요청을 한다. 그러므로 ERROR 타입 요청이 들어온 경우 필터가 동작하지 않도록 설정해야한다. 

 

@Configuration
public class WebConfig {
    @Bean
    public FilterRegistrationBean logFilter(){
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new LogFilter());
        filterFilterRegistrationBean.setOrder(1);
        filterFilterRegistrationBean.addUrlPatterns("/*");
        // DispatcherType 설정
        filterFilterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST);
        return filterFilterRegistrationBean;
    }
}

 

 

 

[SpringMVC] 서블릿 필터(Filter)란?

[SpringMVC] 서블릿 세션(Servlet Session) 이용하기 [SpringMVC] Session( 세션 )이란? [SpringMVC] Cookie ( 쿠키 ) 클라이언트가 웹페이지에 접근하려고 한다. 웹페이지는 회원만 접근 가능하므로 서버는 클라이언

lordofkangs.tistory.com

 

필터 설정 관련해서는 위 포스팅을 참고하면 된다. 

 

filterFilterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST); 

 

위 코드처럼 필터는 접근 가능한 요청의 DisapatcherType을 설정할 수 있다. REQUEST로 설정하면 REQUEST 요청만 필터에 접근할 수 있다. 그런데 디폴트가 REQUEST이므로, setDispatcherTypes 메소드를 설정하지 않으면 REQUEST만 접근가능하도록 자동설정된다. 에러 상황에서 필터에 공통로직을 적용하고 싶은 경우 DispatcherType.ERROR를 설정하면 된다. 

 

 

인터셉터(Interceptor)

 

DispatherType은 서블릿에서 제공하는 기능이다. 인터셉터는 Spring이 제공하므로 DispatherType에 관계없이 인터셉터는 동작한다. 인터셉터의 경우 설정시, 특정 URL 패턴을 제외할 수 있다. 

 

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .order(1)
                .addPathPatterns("/**") // 모든 URL 패턴을 허용
                .excludePathPatterns("/css/**","*.ico","/error","/error-page/**"); // 몇개는 제외
    }
}

 

 

인터셉터는 Spring이 제공하는 환경에서 등록할 수 있다. 이때 인터셉터 관련 설정을 하는데, 특정한 URL 패턴을 가진 요청은 배제할 수 있다. 위 코드를 보면 /error-page/** 요청은 배제하도록 설정했다. 그러므로 WAS의 오류페이지 요청이 들어오면 해당 인터셉터는 호출되지 않는다. 

 

 

이처럼 예외 상황이 발생했을 경우, 필터와 인터셉터가 무의미하게 호출되지 않도록 설정이 가능하다. 

 

 

 


 

 

참고자료

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

 

 

 

 

 

 

 

 

 

 

 

반응형