김영한 강사님의 스프링 MVC 2편 예외 처리 파트를 학습하다 보면, WAS가 오류 페이지 처리를 위해 내부적으로 재요청을 보낸다는 사실을 배운다. 이때 필터와 인터셉터 각각의 중복 호출 방지법을 실습하게 되는데, 여기서 한 가지 의문이 생겼다.
"필터는 요청의 '성격'을 보고 판단하는데, 인터셉터는 왜 요청의 '경로'를 보고 판단해야 할까?"
강의에서 배운 기술적 사실을 바탕으로, 두 도구가 예외라는 특수한 상황을 필터링하는 '판단의 근거'가 서로 다른지 그 설계 차이를 정리해봤다.
필터는 서블릿 표준 기술이다. 즉, 스프링보다 더 바깥쪽인 서블릿 컨테이너(WAS) 수준에서 동작한다. 그래서 WAS가 제공하는 요청의 성격, 즉 DispatchType 메타데이터를 직접 활용할 수 있다.
REQUEST)인지, 에러 처리를 위한 서버 내부의 재요청(ERROR)인지 그 성격(Type)을 보고 실행 여부를 결정한다.REQUEST로 설정한다. 따라서 별도 설정을 하지 않으면 ERROR 타입의 요청은 필터 로직 근처에도 가지 못한다.인터셉터는 스프링 MVC 내부 기술이다. 필터와 달리 서블릿 컨테이너가 관리하는 DispatchType이라는 메타데이터에 의존하지 않는다.
/error-page/**)를 excludePathPatterns에 직접 등록하여 차단한다.여기서 핵심적인 질문이 남는다. "인터셉터도 DispatchType을 판단 근거로 삼으면 더 편하지 않았을까?"
Baeldung의 아티클과 스프링의 구조를 살펴보며 나름의 이유를 추론해 보았다.
DispatchType을 활용하는 것이 가장 원자적이고 확실한 방법이다.결국, "서 있는 위치가 다르면 판단의 근거(보이는 정도)도 다르다"는 점이 두 도구의 예외 처리 메커니즘을 가른 근본적인 차이라고 생각한다.
단순히 오류 페이지 재요청 시 필터와 인터셉터가 중복 호출되는 문제를 설정으로 해결하는 데 그치지 않고, 왜 두 도구의 필터링 방식이 다른지 그 기저의 설계 의도를 정리해 보았다.
시스템 메타데이터(DispatchType)를 활용하는 필터와 애플리케이션 문맥(Path)을 활용하는 인터셉터의 차이는, 결국 각 도구가 서 있는 태생적 위치와 그에 따른 책임 영역이 어디인지 보여준다.
이번 정리를 통해 서블릿과 스프링 MVC가 요청을 바라보는 관점 차이를 조금 더 명확하게 구분할 수 있게 되었다.