WEB
서블릿 리스너
NellKiM
2024. 11. 20. 11:21
**리스너 (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;
@WebListener
public class MyAppListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("애플리케이션 시작");
// 리소스 초기화 코드
}
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("애플리케이션 종료");
// 리소스 해제 코드
}
}
리스너의 활용 예
- 로그 기록: 사용자 세션, 요청별 로그 추적.
- 리소스 관리: 데이터베이스 연결 풀 초기화 및 해제.
- 세션 추적: 사용자 수 통계 계산.
- 요청 처리: 요청 전후의 전처리/후처리 작업.
결론
리스너는 서블릿 기반 웹 애플리케이션의 이벤트 처리를 돕는 강력한 도구입니다. 적절한 리스너를 사용하면 시스템의 상태를 효과적으로 관리하고, 애플리케이션 동작을 세밀하게 제어할 수 있습니다.