Listener
Listener는 웹 애플리케이션에서 발생하는 이벤트에 대한 모니터링 객체다. 개발자는 Servlet을 만들지만 객체를 만들거나 호출하지 않는다 - Container가 라이프 사이클에 따라 관리한다.
ServletContextListener
웹 애플리케이션 생성에서 소멸까지의 주요 사항 모니터링. 개별 서블릿 동작 전에 초기화하는데 비용이 많이 드는 공유 자원의 초기화에 주로 사용한다.
주요 용도
- 데이터베이스 연결 풀 초기화: 애플리케이션 시작 시 한 번만 생성
- 전역 설정 로드: 설정 파일 읽기, 캐시 초기화
- 자원 정리: 애플리케이션 종료 시 연결된 자원 해제
구현 예시
AppListener.java
@WebListener
public class AppListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 애플리케이션 시작 시 자원 초기화
System.out.println("애플리케이션 시작");
// 예: 데이터베이스 연결 풀 초기화 등
// ServletContext에 공유 자원 저장 가능
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 애플리케이션 종료 시 자원 정리
System.out.println("애플리케이션 종료");
}
}Event-Driven Architecture
Listener는 이벤트 기반 아키텍처의 기초다. 현대의 마이크로서비스 아키텍처(MSA)에서도 이벤트 드리븐 방식을 활용한다.
이벤트 종류
- 애플리케이션 라이프사이클 이벤트: 애플리케이션 시작/종료
- 세션 라이프사이클 이벤트: 세션 생성/소멸, 타임아웃
- 요청 라이프사이클 이벤트: 요청 시작/완료
- 속성 변경 이벤트: Context, Session, Request 속성 추가/수정/삭제
Listener 인터페이스 종류
1. ServletContextListener
contextInitialized(): 웹 애플리케이션 시작 시contextDestroyed(): 웹 애플리케이션 종료 시
2. HttpSessionListener
sessionCreated(): 세션 생성 시sessionDestroyed(): 세션 소멸 시
3. ServletRequestListener
requestInitialized(): 요청 시작 시requestDestroyed(): 요청 완료 시
실무 활용 예시
데이터베이스 연결 풀 초기화
DatabaseInitListener.java
@WebListener
public class DatabaseInitListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
// HikariCP 연결 풀 초기화
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("dbuser");
config.setPassword("dbpass");
config.setMaximumPoolSize(10);
config.setMinimumIdle(5);
config.setConnectionTimeout(30000);
HikariDataSource dataSource = new HikariDataSource(config);
// ServletContext에 저장하여 전체 애플리케이션에서 사용
ServletContext context = sce.getServletContext();
context.setAttribute("dataSource", dataSource);
System.out.println("데이터베이스 연결 풀 초기화 완료");
} catch (Exception e) {
throw new RuntimeException("DB 연결 풀 초기화 실패", e);
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
HikariDataSource dataSource =
(HikariDataSource) context.getAttribute("dataSource");
if (dataSource != null) {
dataSource.close();
System.out.println("데이터베이스 연결 풀 종료");
}
}
}정리
- Listener: 애플리케이션 이벤트 감지
- ServletContextListener: 애플리케이션 시작/종료 시 자원 관리
- HttpSessionListener: 세션 생성/소멸 모니터링
- ServletRequestListener: 요청 처리 모니터링
- AttributeListener: 속성 변경 감사 로깅
- 이벤트 드리븐 방식으로 동작
- 공유 자원 초기화와 정리에 필수적
- 성능 모니터링, 감사 로깅, 세션 관리 등 실무에서 광범위하게 활용
Last updated on