Servlet이란
Servlet은 클라이언트의 요청을 처리하고, 그 결과를 응답하는 Java의 웹 프로그래밍 기술이다.
Servlet Container는 웹 서버에 오는 요청을 가장 먼저 받습니다.
Servlet Filter를 통해 전달받은 요청을 필터링할 수 있습니다. Spring Security의 Filter도 Servlet Filter에 속하며, 해당 위치에서 인증/인가를 처리합니다.
Servlet 특징
- 클라이언트의 요청에 대해 동적으로 작동한다.
- Java Thread를 이용하여 동작한다.
- Request, Response 객체를 통해 개발자가 직접 HTTP 요청을 Parsing 하지 않고 편리하게 사용할 수 있게 해 준다.
Servlet 통신 방식
- 클라이언트 요청이 Servlet Container로 Request를 전송한다.
- 요청을 받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성한다.
- 해당 요청이 Controller에 전달되고 해당하는 Service 메서드를 호출하여 요청을 처리합니다.
- HttpServletResponse에 응답할 데이터를 담아 전송한다.
Servlet Container
Servlet Container는 Servlet을 관리하기 위한 컨테이너입니다.
Tomcat 처럼 Servlet을 지원하는 WAS를 Servlet Container라고 부릅니다.
Servlet Container 역할
- Servlet 객체를 생성, 초기화, 호출, 종료 등 일련의 생명주기를 관리한다.
- 웹 서버와의 간편한 통신을 지원한다.
- Multi Thread Pool을 관리한다.
- Servlet Container 내부에 ThreadPool 이라는 공간이 존재해서 필요한 쓰레드를 미리 쓰레드 풀에 보관해놓고 사용합니다.
Dispatcher Servlet 란
Servlet의 일종으로 스프링 MVC의 중앙 Servlet로써 애플리케이션으로 오는 모든 요청을 핸들링하고 공통 작업을 처리해 주는 Servlet입니다.
Dispatcher Servlet은 프론트 컨트롤러라고도 하며, 서블릿 컨테이너 맨 앞에서 모든 요청을 받아 처리해주고 있어 프론트 컨트롤러라고 불립니다.
Filter & Interceptor 동작 위치
Filter는 간단히 서버에 오는 요청을 가장 먼저 받아서 적절하게 걸러주는 역할을 합니다.
Interceptor는 특정 호출을 가로채서 사전/사후에 기존 컨트롤러에 로직을 추가할 수 있습니다. 요청과 응답을 가로채서 원하는 동작을 추가하는 역할을 합니다.
Filter
Filter는 DispatcherServlet 처리 전/후에 동작하여 사용자의 요청이나 응답을 가장 먼저 처리합니다.
Filter Chain을 통해 연쇄적으로 필터를 설정할 수 있습니다.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
- init : 필터가 웹 컨테이너에 생성될 때 실행됩니다.
- doFilter : Request, Response가 필터를 거칠 때 수행되는 메서드로, 체인을 따라 다음에 존재하는 필터로 이동합니다.
- destroy : 필터가 소멸될 때 실행됩니다.
Interceptor
인터셉터는 HttpServletRequest, HttpServletResponse를 인자로 받아 컨트롤러에 요청을 사전/사후에 필요한 로직을 처리할 수 있습니다.
public interface HandlerInterceptor {
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 {
}
}
- 각 메서드의 반환 값이 true이면 Hanlder의 다음 동작이 실행됩니다.
- false인 경우 중단되어, 남은 인터셉터와 컨트롤러가 실행되지 않습니다.
- preHandle : 지정된 컨트롤러의 동작 이전에 가로채는 역할을 합니다.
- postHandle : 지정된 컨트롤러의 동작 이후에 처리합니다. 스프링 MVC의 Dispatcher Servlet이 화면을 처리하기 전에 동작합니다.
- afterCompletion : DispatcherServlet의 화면 처리가 완료된 상태에서 처리합니다.
주로 HandlerInterceptor 인터페이스는 preHandle을 사용하여 컨트롤러에 요청을 가로채어 추가 로직을 적용합니다. (ex: 인증 ..)