WEB
서블릿 리스너
2024. 11. 20. 11:21

**리스너 (Listener)**는 서블릿 컨테이너에서 발생하는 특정 이벤트를 감지하고, 이에 대한 동작을 정의하기 위해 사용하는 인터페이스입니다. 웹 애플리케이션에서 중요한 상태 변화(예: 애플리케이션 시작/종료, 세션 생성/종료, 요청 발생 등)를 감지하고 처리하는 데 활용됩니다.

리스너의 역할

  1. 웹 애플리케이션, 세션, 요청 등의 생명 주기를 감지.
  2. 상태 변경 이벤트를 처리(예: 세션 추적, 리소스 초기화/해제, 로그 기록 등).
  3. 설정 파일(web.xml) 또는 애너테이션으로 등록하여 동작.

리스너의 주요 종류

리스너는 감지하려는 대상(애플리케이션, 세션, 요청)에 따라 구분됩니다.

1. ServletContextListener

  • 웹 애플리케이션의 시작과 종료를 감지.
  • 주로 리소스 초기화 및 종료(예: 데이터베이스 연결 풀 생성/해제)에 사용.

메서드:

  • contextInitialized(ServletContextEvent event)
    → 애플리케이션이 시작될 때 호출.
  • contextDestroyed(ServletContextEvent event)
    → 애플리케이션이 종료될 때 호출.

예제:


      
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyAppListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("애플리케이션 시작");
// 리소스 초기화 코드
}
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("애플리케이션 종료");
// 리소스 해제 코드
}
}

2. HttpSessionListener

  • 세션의 생성과 소멸을 감지.
  • 주로 사용자 세션 추적, 통계 수집 등에 사용.

메서드:

  • sessionCreated(HttpSessionEvent event)
    → 세션이 생성될 때 호출.
  • sessionDestroyed(HttpSessionEvent event)
    → 세션이 소멸될 때 호출.

예제:


      
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
System.out.println("세션 생성됨: " + event.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("세션 소멸됨: " + event.getSession().getId());
}
}

3. ServletRequestListener

  • **요청(Request)**의 생성과 소멸을 감지.
  • 요청별 초기화 작업이나 로깅에 사용.

메서드:

  • requestInitialized(ServletRequestEvent event)
    → 요청이 생성될 때 호출.
  • requestDestroyed(ServletRequestEvent event)
    → 요청이 소멸될 때 호출.

예제:


      
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent event) {
System.out.println("요청 시작");
}
@Override
public void requestDestroyed(ServletRequestEvent event) {
System.out.println("요청 종료");
}
}
 

4. AttributeListener (속성 변경 감지 리스너)

  • **속성(Attribute)**의 추가, 수정, 삭제를 감지.
  • 세 가지 대상에 대해 각각의 리스너가 있음:
    • ServletContextAttributeListener
    • HttpSessionAttributeListener
    • ServletRequestAttributeListener

메서드:

  • attributeAdded(AttributeEvent event)
    → 속성이 추가될 때 호출.
  • attributeRemoved(AttributeEvent event)
    → 속성이 제거될 때 호출.
  • attributeReplaced(AttributeEvent event)
    → 속성이 변경될 때 호출.

예제 (HttpSessionAttributeListener):


      
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("속성 추가: " + event.getName() + " = " + event.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("속성 제거: " + event.getName());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("속성 변경: " + event.getName());
}
}

리스너 등록

리스너는 web.xml 파일이나 애너테이션으로 등록할 수 있습니다.

1. web.xml로 등록


      
<listener>
<listener-class>com.example.MyAppListener</listener-class>
</listener>

2. 애너테이션으로 등록


      
import javax.servlet.annotation.WebListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
@WebListener
public class MyAppListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("애플리케이션 시작");
// 리소스 초기화 코드
}
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("애플리케이션 종료");
// 리소스 해제 코드
}
}

리스너의 활용 예

  1. 로그 기록: 사용자 세션, 요청별 로그 추적.
  2. 리소스 관리: 데이터베이스 연결 풀 초기화 및 해제.
  3. 세션 추적: 사용자 수 통계 계산.
  4. 요청 처리: 요청 전후의 전처리/후처리 작업.

결론

리스너는 서블릿 기반 웹 애플리케이션의 이벤트 처리를 돕는 강력한 도구입니다. 적절한 리스너를 사용하면 시스템의 상태를 효과적으로 관리하고, 애플리케이션 동작을 세밀하게 제어할 수 있습니다.

'WEB' 카테고리의 다른 글

SQL Session Factory  (0) 2024.12.02
이미지 파일저장  (0) 2024.11.21
JSP INCLUDE  (0) 2024.11.21
Scope  (0) 2024.11.20
서블릿 filter 설명  (0) 2024.11.20