ServletListenerRegistrationBean 이란?
Spring Boot 에서 서블릿 스펙의 Listener(예: HttpSessionListener, ServletContextListener) 를 서블릿 컨테이너에
등록하기 위한 Spring Bean 이다.
즉, 서블릿 컨테이너가 감지할 수 있도록 Spring Bean 을 리스너로 등록해주는 중간 다리 역할을 한다.
🔄 동작 흐름 요약
- HttpSessionListener 같은 서블릿 리스너를 구현하거나 이미 구현된 클래스(HttpSessionEventPublisher) 를 사용한다.
- ServletListenerRegistrationBean 으로 위 클래스를 Spring Bean 으로 등록한다.
- Spring Boot 는 내장 톰캣(또는 서블릿 컨테이너)을 초기화할 때 해당 리스너를 컨테이너에 자동 등록한다.
- 등록된 리스너는 세션 생성/파괴 등의 이벤트가 발생할 때 해당 리스너가 자동으로 반응하여 호출된다.
🔧 예시
@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
return new ServletListenerRegistrationBean<>(new HttpSessionEventPublisher());
}
- HttpSessionEventPublisher 는 HttpSessionListener 를 구현하고 있다.
- Spring Boot 는 이것을 서블릿 컨테이너에 리스너로 등록한다.
- HttpSessionEventPublisher 는 Spring Security 에서 세션 이벤트를 추적하기 위해 사용하는 리스너이다.
- 서블릿 컨테이너에 등록된 리스너가 세션 생성/종료 시 해당 메서드의 콜백 메서드가 호출된다.
🔍 ServletListenerRegistrationBean 이 중요한 이유
Spring 의 일반적인 컴포넌트(@Component, @Service) 는 서블릿 컨테이너 레벨의 이벤트를 감지할 수 없다.
하지만 ServletListenerRegistrationBean 을 통해 Spring Boot 레벨에서 서블릿 레벨의 리스너를 쉽게 등록할 수 있다.
🧠 참고
HttpSessionListener 를 직접 구현하여 서블릿 컨테이너 레벨의 리스너를 Spring Bean으로 등록할 수 있다.
public class CustomSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
System.out.println("세션 생성됨 === "+se.toString());
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("세션 종료됨 === "+se.toString());
}
}
@Bean
public ServletListenerRegistrationBean<CustomSessionListener> sessionListener() {
return new ServletListenerRegistrationBean<CustomSessionListener>(new CustomSessionListener());
}