**리스너 (Listener)**는 서블릿 컨테이너에서 발생하는 특정 이벤트를 감지하고, 이에 대한 동작을 정의하기 위해 사용하는 인터페이스입니다. 웹 애플리케이션에서 중요한 상태 변화(예: 애플리케이션 시작/종료, 세션 생성/종료, 요청 발생 등)를 감지하고 처리하는 데 활용됩니다.
리스너의 역할
- 웹 애플리케이션, 세션, 요청 등의 생명 주기를 감지.
- 상태 변경 이벤트를 처리(예: 세션 추적, 리소스 초기화/해제, 로그 기록 등).
- 설정 파일(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;@WebListenerpublic class MyAppListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { System.out.println("애플리케이션 시작"); // 리소스 초기화 코드 } @Override public void contextDestroyed(ServletContextEvent event) { System.out.println("애플리케이션 종료"); // 리소스 해제 코드 }}
리스너의 활용 예
- 로그 기록: 사용자 세션, 요청별 로그 추적.
- 리소스 관리: 데이터베이스 연결 풀 초기화 및 해제.
- 세션 추적: 사용자 수 통계 계산.
- 요청 처리: 요청 전후의 전처리/후처리 작업.
결론
리스너는 서블릿 기반 웹 애플리케이션의 이벤트 처리를 돕는 강력한 도구입니다. 적절한 리스너를 사용하면 시스템의 상태를 효과적으로 관리하고, 애플리케이션 동작을 세밀하게 제어할 수 있습니다.
'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 |