Spring

서블릿 리스너와 서블릿 필터

라우브 2020. 8. 1. 20:48

서블릿 리스너

  • 웹 애플리케이션에서 발생하는 주요 이벤트를 감지하고 각 이벤트에 특별한 작업이 필요한 경우에 사용할 수 있다.
    • 서블릿 컨텍스트 수준의 이벤트
      • 컨텍스트 라이프 사이클 이벤트
      • 컨텍스트 어트리뷰트 변경 이벤트
    • 세션 수준의 이벤트
      • 세션 라이프 사이클 이벤트
      • 세션 어트리뷰트 변경 이벤트

서블릿 필터

  • 들어온 요청을 서블릿으로 보내고, 또 서블릿이 작성한 응답을 클라이언트로 보내기 전에 특별한 처리가 필요한 경우 사용.
  • 체인 형태의 구조.

서블릿 리스너 동작 확인

public class MyListener  implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Context Initialized");
        sce.getServletContext().setAttribute("name", "dongheon");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Context Destroyed");
    }
}

 

위 리스너를 등록한 후, 아래 서블릿을 실행하면

public class HelloServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("Hello Servlet init");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
        resp.getWriter().println("<html>");
        resp.getWriter().println("<head>");
        resp.getWriter().println("<body>");
        resp.getWriter().println("<h1>Hello, " + getName() +"</h1>");
        resp.getWriter().println("</body>");
        resp.getWriter().println("</head>");
        resp.getWriter().println("</html>");
    }

    private Object getName() {
        return getServletContext().getAttribute("name");
    }

    @Override
    public void destroy() {
        System.out.println("Hello Servlet destroyed");
    }
}

 

 

 

결과는 아래와 같다.

로그를 보면 Context(리스너)가 먼저 초기화 되었고, 이후 서블릿이 초기화 된 걸 알 수 있다. 

종료는 반대로, 서블릿이 먼저 종료된 다음 컨텍스트가 종료되는 것을 볼 수 있다. 

 

서블릿 필터 동작 확인

먼저 아래와 같은 필터를 등록한다.

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter Init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("Filter Destroy");
    }
}

 

 

 

이후, 실행 결과는 아래와 같다.

Context -> Filter -> Servlet 순으로 초기화 되는 것을 볼 수 있다. 

또한 doGet이 호출되기전 doFilter가 먼저 실행되는 것을 유의하자.

'Spring' 카테고리의 다른 글

Database Transaction과 데이터 동기화 -1  (0) 2021.08.01
스프링 MVC 구성 요소  (0) 2020.08.02
DispatcherServlet이란  (0) 2020.08.02
서블릿이란 ?  (0) 2020.07.31
스프링 MVC 소개  (0) 2020.07.30