이미지 참고: https://www.baeldung.com/spring-mvc-handlerinterceptor-vs-filter
public interface Filter {
// 필터가 처음으로 생성될 때 한 번 초기화를 위해 호출
// 리소스를 초기화하거나 설정을 읽어들이는 데 사용됨
default void init(FilterConfig filterConfig) throws ServletException {
}
// 필터링 작업 수행
// 클라이언트의 요청을 가로채고, 필터 체인을 따라 다음 필터에 요청을 전달하거나 서블릿으로 전달
// 예외를 던지거나 다음 필터 또는 서블릿을 호출하지 않으면 요청이 중단될 수 있음
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
// 필터가 소멸될 때 호출
default void destroy() {
}
}
필터는 다음 필터를 호출할 때 request와 response를 넘겨주기 때문에, 해당 값을 특정 로직에 따라 처리하여 원하는 값으로 넘겨줄 수 있다.
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 다른 request와 response를 넣어줄 수 있음
chain.doFilter(request, response);
}
}
public interface HandlerInterceptor {
// 컨트롤러가 호출되기 전 실행
// true면 다음 인터셉터가 진행되거나 컨트롤러 메서드가 수행된다.
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
// 컨트롤러가 호출된 후 실행
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
// 뷰에서 최종 결과를 생성하는 일을 포함해 모든 작업이 완료된 이후 실행
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
각각 언제 실행되는지는 알겠는데, 잘 와닿지는 않는다. 이를 위해서는 DispatcherServlet을 알 필요가 있어보인다.
각각의 용어에 대해서 어렴풋이 개념은 알겠지만, 나는 Web Server와 Web Application Server를 구분해서 애플리케이션을 만들지 않았었는데 어떻게 동작했던 것일까?
스프링에서는 Tomcat이 Web Server와 Servlet Container 역할을 하며, 아래와 같이 아키텍쳐가 구성되어 있다고 한다.
이미지 참고: https://taes-k.github.io/2020/02/16/servlet-container-spring-container/
Filter와 Interceptor 정의
Servlet의 정의
용어 정리
CGI 참고
tomcat 역할(servlet container, web server)
tomcat의 역할