[스프링 웹 MVC] 서블릿 리스너와 서블릿 필터

2022. 3. 20. 21:21JAVA/Spring Framework

728x90
반응형
SMALL

서블릿 리스너

웹 애플리케이션에서 발생하는 주요 이벤트를 감지하고, 각 이벤트에 특별한 작업이 필요한 경우에 사용

  • 서블릿 컨텍스트 수준의 이벤트
    • 컨텍스트 라이프사이클 이벤트
    • 컨텍스트 애트리뷰트 변경 이벤트
  • 세션 수준의 이벤트
    • 세션 라이프사이클 이벤트
    • 세션 애트리뷰트 변경 이벤트

 

 

서블릿 필터

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

 

 

 

먼저 리스너를 등록해볼게요!

 

package com.example;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Context Initialized");
        sce.getServletContext().setAttribute("name", "Servlet");
    }

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

ServletContextListener를 구현하는 MyListener입니다.

리스너가 제대로 등록됐는지 확인하기 위해 name이라는 애트리뷰트를 설정해줄게요!

 

package com.example;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("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("destroy");
    }
}

리스너에서 등록한 name을 출력하도록 HelloServlet의 doGet 을 이렇게 수정해주겠습니다.

 

 

 

그리고 web.xml에 리스너를 등록해줘야 합니다.

 

 

 

 

이제 서버를 실행시켜 볼까요!?

 

리스너에서 name으로 등록한 Servlet이 출력되는 것을 확인할 수 있어요!

 

그리고 서블릿이 생성되기 전에 먼저 생성되고, 가장 마지막에 destroy 되는 것을 확인할 수 있습니다. 🤓

 

 

 

이제 필터 차례입니다.

앞서 말씀 드렸듯, 필터는 서블릿으로 요청을 보내고 응답을 받기 전 특별한 역할을 수행해줄 수 있습니다.

 

 

package com.example;

import javax.servlet.*;
import java.io.IOException;

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("Filter");
        filterChain.doFilter(servletRequest, servletResponse); // Hello Servlet의 doGet으로 연결해주는 역할
    }

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

 

doFilter에서 필터 체인을 통해 HelloServlet과 연결해주었습니다.

그리고 서버를 실행시키면, 아까와 동작 상 차이는 없지만 라이프사이클이 아래와 같음을 확인할 수 있습니다.

 

728x90
반응형
LIST

'JAVA > Spring Framework' 카테고리의 다른 글

[스프링 웹 MVC] 서블릿 애플리케이션 개발  (0) 2022.03.16
[스프링 웹 MVC] 스프링 MVC 소개  (0) 2022.03.14
스프링 웹 MVC  (0) 2022.03.14