Skip to Content
공부백엔드Servlet과 웹 서버6. Listener

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