리스너(Listener)
특정 이벤트가 발생하면 정의한 내용(메서드)을 실행하는 컴포넌트로 '이벤트 핸들러'라 부르기도 한다.
서블릿(Servlet)에서 활용되는 리스너는 웹 어플리케이션 수행과 관련하여 발생하는 각종 이벤트에 대한 처리를 한다.
이벤트 소스에 따른 이벤트 핸들러와 스코프
- ServletContext
애플리케이션 전체에 대해 접근할 수 있다.
서블릿 컨텍스트란 하나의 서블릿이 서블릿 컨테이너와 통신하기 위해 사용되어지는 메서드들을 가지고있는 클래스
톰캣 컨테이너 실행 시 각 컨텍스트(웹 어플리케이션)마다 하나의 서블릿 컨텍스트 객체를 생성한다. 그리고 톰캣 컨테이너가 종료되면 해당 객체 역시 함께 소멸된다.
서블릿 컨텍스트 객체는 웹 어플리케이션이 실행되면서 어플리케이션 전체의 공통 자원이나 정보를 미리 바인딩하여 서블릿들이 공유하여 사용하도록 한다.
(대충 웹 어플리케이션 시작, 종료 사이클과 함께하며 서블릿(어플리케이션) 실행을 위한 전반적인 정보를 지니고있는 객체로 생각된다.)
- ServletContextListener
웹 어플리케이션 시작과 종료 이벤트에 대한 리스너로 ServletContext에 대한 참조를 얻을 수 있다.
void contextInitialized(ServletContextEvent sce) 웹 어플리케이션 시작 시
void contextDestroyed(ServletContextEvent sce) 웹 어플리케이션 종료 시 실행
- ServletContextAttributeListener
ServletContext에 attribute를 추가하거나 제거, 수정되었을 때에 대한 이벤트 리스너로 핸들러 메서드에서는 이벤트 소스로 주어진 attribute에 대한 정보를 얻을 수 있다.
void attributeAdded(ServletContextAttributeEvent event) 요소가 추가되었을 때
void attributeRemoved(ServletContextAttributeEvent event) 요소가 삭제되었을 때
void attributeReplaced(ServletContextAttributeEvent event) 요소가 수정되었을 때 실행
- HttpSession
이벤트 소스는 HttpSession로 브라우저에서만 접근 가능하다.
- HttpSessionListener
Http 세션의 시작과 종료 이벤트에 대한 리스너로 핸들러 메서드에서 현재 세션 객체를 얻을 수 있다.
void sessionCreated(HttpSessionEvent se) 세션 생성 시 실행
void sessionDestroyed(HttpSessionEvent se) 세션 종료 시 실행
- HttpSessionAttributeListener
Http 세션에 attribute가 추가, 제거, 수정되었을 때에 대한 리스너로 세션의 속성에 대해 다뤄야할 때 주로 사용한다.
void attributeAdded(HttpSessionBindingEvent event) 세션에 setAttribute() 로 새로운 요소가 등록되었을 때
void attributeRemoved(HttpSessionBindingEvent event) 세션에 removeAttribute() 실행으로 요소가 삭제되었을 때
void attributeReplaced(HttpSessionBindingEvent event) 기존 속성에 setAttribute() 로 값이 변경되었을 때
- HttpSessionBindingListener
인터페이스를 구현한 객체가 세션에 바인딩시키거나 언바인딩될 때 메서드가 실행된다. 자신이 세션에 속성으로 추가되었는지 알기 위하여 사용한다.
void valueBound(HttpSessionBindingEvent event) 구현 객체가 세션에 바인딩될 때
void valueUnbound(HttpSessionBindingEvent event) 구현 객체가 세션에 언바인딩(제거)될 때
- HttpSessionActivationListener
세션에 속성으로 추가된 일반적인 객체들이 다른 JVM으로 옮겨가거나 옮겨질 때 이벤트가 발생한다.
예를 들어, WAS를 두 대 이상 구동하는 경우 요청할 때마다 어떤 WAS로 보내질 지 모른다. 하지만 세션은 WAS에 존재하는 것으로 WAS01에서 세션이 생성되고 두번째 요청이 WAS02로 가는 경우 B에는 세션이 없다. 이럴 경우 WAS01에 생성된 세션을 WAS02로 이동시킬 수 있다.
This basically means that the session is migrated from one VM to another. A container that migrates sessions between VMs must invoke the corresponding events when an object implements the HttpSessionActivationListener.
(참고 - https://memorynotfound.com/httpsessionactivationlistener-example-use-case/ )
- ServletRequest
서블릿 요청과 관련된 리스너들로 해당 요청/응답 사이클에 대해서만 접근 가능하다.
- ServletRequestListener
클라이언트로부터의 요청으로 인한 ServletRequest 생성과 응답 이후 제거 시에 대한 이벤트 리스너이다.
void requestInitialized(ServletRequestEvent sre) 요청 생성 시
void requestDestroyed(ServletRequestEvent sre) 응답 후 요청 제거 시 실행
- ServletRequestAttributeListener
ServletRequest에 attribute를 추가하거나 제거, 수정되었을 때에 대한 이벤트 리스너이다.
void attributeAdded(ServletRequestAttributeEvent srae) 요소가 추가되었을 때
void attributeRemoved(ServletRequestAttributeEvent srae) 요소가 삭제되었을 때
void attributeReplaced(ServletRequestAttributeEvent srae) 요소가 수정되었을 때 실행
커스텀 리스너 등록
어노테이션 방식으로 추가하기
@WebListener
public class CustomListener implements XXListener
web.xml에 직접 등록하기
<listener>
<listener-class>{패키지경로}.CustomListener</listener-class>
</listener>
<listener>
<listener-class>{패키지경로2}.CustomListener2</listener-class>
</listener>
<listener> 태그는 리스너 등록 시 사용하며 반드시 하위 태그인 <listener-class>를 이용하여 클래스를 지정해줘야한다. 여러 리스너 등록 시 <listener> 태그를 여러개 사용하면 된다.
[서블릿/JSP] 리스너(LISTNER)란? 이벤트 리스너의 개념 설명. 구현 및 등록하기 https://dololak.tistory.com/616
[JSP/Servlet] 서블릿의 필터와 리스너 기능 https://mycool0905.github.io/web/java/servlet/jsp/2020/09/23/filter-and-listener.html
jsp&servlet:: ServletContext란 https://java117.tistory.com/18
댓글 영역