코딩항해기

[JSP] Servlet - 리스너 Listener 본문

JSP

[JSP] Servlet - 리스너 Listener

miniBcake 2024. 9. 2. 11:22

 

 

리스너 Listener

컨테이너에서 발생하는 이벤트를 모니터링하다가 특정 이벤트가 발생하면 실행되는 특수한 서블릿으로, '이벤트 리스너(Event Listener)'라고도 한다. 웹 애플리케이션 실행에 필요한 정보를 제공하거나 톰캣 시작/종료와 같은 특정 상황에 자동으로 동작하는 프로그램을 구현할 때 사용한다. 이때 리스너는 서블릿과 마찬가지로 어노테이션 기반 코드로 작성할 수 있다.

 

특정 이벤트에 따라 동작하는 서블릿 인터페이스를 구현하는 구조이며, 리스너는 기본적으로 생명 주기 변화와 Scope Object에서 관리하는 속성의 변화를 모니터링 한다. 서버의 시작과 종료(ServletContext)도 감지할 수 있으며, 샘플데이터를 넣거나 DB와의 연결을 종료하는 등의 기능을 구현할 수 있다.

(대표적인 기능 : 초기화 매개변수와 연동, 샘플 데이터, 복잡한 환경 설정, 특정 이벤트에 동작하는 기능)

클라이언트의 요청에 따라 서블릿을 통해 Session, Request 객체가 생성되거나 속성의 변화가 발생하면 컨테이너에서 이벤트를 감지하고 해당 이벤트를 처리하는 리스너 클래스의 메서드를 호출하게 된다. 리스너의 경우 특정 서블릿이나 JSP에서 사용하기 위한 목적보다는 웹 애플리케이션 전체의 설계나 운영 관점에서 사용한다고 볼 수 있다.

 

 

Listener 종류

 

이벤트 소스 이벤트 리스너 이벤트 발생 객체 설명
ServletContext ServletContextListener ServletContextEvent 웹 어플리케이션 시작, 종료
ServletContextAttributeListener ServletContextAttributeEvent ServletContext에 attribute가 추가되거나 제거, 수정
HttpSession HttpSessionListener HttpSessionEvent HTTP 세션의 시작 종료
HttpSessionAttributeListener HttpSessionBindingEvent 세션에 추가, 제거, 수정
ServletRequest ServletRequestListener ServletRequestEvent 요청의 생성, 요청의 응답 후 제거
ServletRequestAttributeListener ServletRequestAttributeEvent 요청 추가, 제거, 수정

* 이 외에도 HttpSessionActivationListener, HttpSessionBindingListener, AsyncListener가 있다.

 

 

Listener의 구조

(ServletContext로 예시, 해당 설정에서 감지할 이벤트를 고를 수 있다.)

 

@WebListener //web.xml의 listener 설정을 대신함
public class TestListener implements ServletContextListener {
//ServletContextListener인터페이스를 구현

	//생성자
    public TestListener() {
        // TODO Auto-generated constructor stub
    }

    public void contextInitialized(ServletContextEvent sce)  { 
         // 서버 시작할 때
    }

    public void contextDestroyed(ServletContextEvent sce)  { 
         // 서버 종료될 때
    }	
}

 

어노테이션을 달지 않고 web.xml을 사용할 수도 있지만 어노테이션이 더욱 최신 기술이고, 호환성을 위해 어노테이션으로 다는 것이 좋다. Servlet 파일을 생성하면 자동으로 web.xml에 설정이 추가되므로, 어노테이션을 달고 web.xml에서 리스너 설정 태그를 지워줘야한다. (함께 사용할 수는 없다.)

  //자동으로 생긴 리스너 태그 (web.xml)
  <listener>
    <listener-class>controller.common.TestListener</listener-class>
  </listener>

 

 

중복된 이벤트 Listener 실행순서

같은 이벤트에 대해 리스너가 여러개 일 때는 등록된 순서(DataSourceListener -> JmsListener)대로 실행되며, 종료 메서드는 반대의 순서(JmsListener -> DataSourceListener)로 실행된다.

  <listener>
      <listener-class>listen.DataSourceListener</listener-class>
  </listener>
  
  <listener>
      <listener-class>listen.JmsListener</listener-class>
  </listener>