Inflearn brand logo image

인프런 커뮤니티 질문&답변

yoon6669님의 프로필 이미지
yoon6669

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

서블릿 예외 처리 - 인터셉터

인터셉터가 처음에도 호출제외 되어야하는것 아닌가요?

작성

·

41

0

필터부분은 DispatcherType으로 구분하기때문에 이해를 한 것 같은데..

인터셉터는 잘 이해를 못했습니다.

인터셉터에서 excludePathPatterns("/css/**", "/*.ico", "/error", "/error-page/**") 하여 경로를 제외했는데요.

그렇다면 첫 요청에서 에러 발생 후 인터셉터 호출은 아예 제외되어야하는 것아닌가요..?

그러니까 6:00 경부터 말씀하시는 전체흐름에서

  1. WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 -> View

가 첫 흐름인데 지금 호출된 로그를 보면 afterCompletion 만 호출된 상황입니다.

이것은 요청 완료 이후 서블릿?에서 호출되는 것으로 기억하고 있는데요.

그런데 인터셉터에서 경로를 제외했으니 afterCompletion 역시 호출 자체가 안되어야 하는 것아닌가요?

 

지금 강의에선 첫 요청에서의 인터셉터는 호출되고 이후 에러 발생후 요청에서의 인터셉터는 제외 경로 설정대로 로그 출력이 되지 않는데요.

 

에러가 발생하면 addInterceptors()extendHandlerExceptionResolvers() 은 호출이 안되고 afterCompletion 만 호출되는 것으로 기억하는데, excludePathPatterns() 에서 경로를 아예 제외했으니 그냥 자체가 호출 되지 말아야하는것 아닌지 궁금합니다.

왜 첫 요청에서의 인터셉터는 호출되고 에러 발생 했을 떄의 인터셉터에서만 호출 되지 않는건가요? DispatcherType 은 필터에서만 적용되는 거라 인터셉터에 적용되는 경우는 아닌 것 같은데 말이죠..

 

지금 머릿속으로 제대로 정리가 되지않아 질문 이해가 잘 되셨을지 모르겠습니다.

감사합니다.

Dis

 

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. yoon6669님

예외 발생 및 WAS의 내부 오류 페이지 요청 (dispatchType=ERROR)시에 컨트롤러에서 예외가 발생하여 WAS까지 전파되면, WAS는 설정된 오류 페이지(예: /error 또는 /error-page/500)를 찾아서 내부적으로 해당 오류 페이지 경로로 다시 요청을 발생시킵니다.

이 내부 요청은 클라이언트에게는 보이지 않지만, WAS 내부에서는 새로운 요청으로 처리됩니다.

따라서 인터셉터 입장에서 /error로 새로운 요청이 온다고 생각하시면 됩니다.

감사합니다.

 

0

안녕하세요, 인프런 AI 인턴입니다. yoon6669님.

인터셉터의 excludePathPatterns과 afterCompletion 호출에 대한 질문에 대해 설명드리겠습니다.

인터셉터의 동작 원리

스프링의 인터셉터는 필터와는 다르게 DispatcherType에 영향을 받지 않고, 요청 경로에 따라 동작을 결정합니다. excludePathPatterns를 사용하여 특정 경로를 제외할 수 있지만, 이는 주로 요청이 최초로 들어올 때 적용됩니다.

afterCompletion 메서드 호출

afterCompletion 메서드는 요청이 완료된 후에 항상 호출되는데, 이는 예외가 발생하더라도 인터셉터 체인을 거쳤던 요청에 대한 후처리로 호출됩니다. 즉, 특정 요청 경로가 제외되었다고 해서 afterCompletion 자체가 호출되지 않는 것은 아닙니다.

첫 요청에서의 인터셉터 호출

첫 요청에서 인터셉터가 호출된 이유는, 최초 요청 시 해당 경로가 인터셉터 체인에 포함되었기 때문입니다. 이후에 에러가 발생하거나 excludePathPatterns의 설정이 제대로 이루어졌다면, 이후 불필요한 경로에서는 인터셉터의 전 단계 메서드(preHandle/postHandle)는 호출되지 않지만, 이미 인터셉터를 거친 요청의 afterCompletion는 예외 발생 여부에 상관없이 처리됩니다.

관련 정보

  • 인터셉터는 스프링의 HandlerInterceptor 인터페이스를 구현합니다. 이 인터페이스는 preHandle, postHandle, afterCompletion 메서드로 구성되어 있습니다.
  • excludePathPatterns를 통해 인터셉터의 특정 경로에 대한 적용을 제외시킬 수 있지만, afterCompletion은 전체 흐름에서 마지막 단계로 이해하시면 됩니다.

추가로 더 깊이 있는 설명이 필요하시다면, 인터셉터 관련 기존 질문과 답변을 확인해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

yoon6669님의 프로필 이미지
yoon6669

작성한 질문수

질문하기