[Web] 리스너(Listener)

2022. 10. 26. 18:50·Programming/Web
728x90

리스너

리스너(Listener)란 컨테이너에서 발생하는 이벤트를 모니터링하다가 특정 이벤트가 발생하면 실행되는 특수한 서블릿으로, '이벤트 리스너(Event Listener)'라고도 한다. 웹 애플리케이션 실행에 필요한 정보를 제공하거나 톰캣 시작/종료와 같은 특정 상황에 자동으로 동작하는 프로그램을 구현할 때 사용한다. 이때 리스너는 서블릿과 마찬가지로 애너테이션 기반 코드로 작성할 수 있다.

리스너를 이해하려면 먼저 리스너가 동작하기 위한 이벤트의 종류와 그에 따른 프로그램 API를 알아야 한다. 리스너는 일반적인 형태의 서블릿이 아니라 특정 이벤트에 따라 동작하는 인터페이스를 구현한 클래스라고 이해하면 쉽다.

 

리스너는 기본적으로 생명 주기 변화와 Scope Object에서 관리하는 속성의 변화를 모니터링하고 해당 이벤트가 발생하면 실행되는 구조다. 예를 들어 ServletContext는 웹 애플리케이션 단위로 생성되는 객체로, 보통 톰캣의 시작과 종료(혹은 웹 애플리케이션의 시작과 종료)와 일치하기 때문에 해당 시점에 실행을 원하는 프로그램이 있다면 리스너로 구현할 수 있다.

리스너의 동작 구조는 다음과 같다.

리스너의 동작 구조

클라이언트의 요청에 따라 서블릿을 통해 Session, Request 객체가 생성되거나 속성의 변화가 발생하면 컨테이너에서 이벤트를 감지하고 해당 이벤트를 처리하는 리스너 클래스의 메서드를 호출하게 된다.

리스너의 경우 특정 서블릿이나 JSP에서 사용하기 위한 목적보다는 웹 애플리케이션 전체의 설계나 운영 관점에서 사용한다고 볼 수 있다.

 

리스너 활용의 대표적인 유형은 다음과 같다.

초기화 매개변수와 연동

톰캣이 시작될 때 'web.xml'의 ServletContext 초기화 매개변수를 읽어 그에 따라 특정 객체를 초기화한 후 서블릿이나 JSP에 제공한다.

 

예제 프로그램 등을 배포할 때 샘플 데이터 제공

프로그램을 실행할 때 DB가 필요한 경우 미리 DB와 연결을 만들어두거나 테이블을 생성하고 샘플 데이터를 로딩하는 등의 작업을 자동으로 수행해서 추가적인 작업 없이 프로그램을 실행할 수 있다.

 

복잡한 환경 설정 제공

프로그램 실행에 필요한 여러 정보(DB, 다른 서비스 연동 정보, 관리자 계정 정보 등 프로그램 외부에서 변하는 정보를 주입하는 형태)가 고정되어 있지 않고 운영하는 서버 상황에 따라 변경되어야 하는 경우, 이를 파일로부터 읽어와 JSP 및 서블릿 등에 제공한다.

 

특정 이벤트에 동작하는 기능 구현

웹 애플리케이션을 실행할 때 함께 동작해야 하는 외부 프로그램이나 서비스의 동작 유무를 확인하고 자동으로 실행할 수 있다.

리스너의 종류

일반적으로 웹 애플리케이션 단위인 서블릿 콘텍스트(ServletContext)와 세션의 변화에 따라 실행되는 리스너를 만들게 된다. 서블릿 콘텍스트와 세션은 웹 애플리케이션 운영에서 중요한 객체다. 각각의 객체에 대해 생명 주기(생성, 소멸 등) 변화 및 정보 공유를 위해 사용하는 속성의 상태 변화를 감지하고 실행되는 형태다.

유형 설명 리스너 인터페이스
ServletContext 생명 주기 변화 대표적인 리스너 이벤트로, ServletContext의 생성과 소멸 시점에 동작한다. 보통 톰캣의 시작 및 종료 시점과 일치한다. javax.servlet.ServletContextListener
ServletContext 속성 변화 ServletContext의 속성이 추가되거나 변경되는 상황에 동작한다. javax.servlet.ServletContextAttributeListener
Session 생명 주기 변화 Session의 생성과 소멸 등 변화에 따라 동작한다. javax.servlet.http.HttpSessionListener
Session 속성 변화 Session의 속성이 추가되거나 변경되는 상황에 동작한다. javax.servlet.http.HttpSessionAttributeListener
  • ServletContextListener: 톰캣의 시작, 종료와 같은 이벤트에 동작하는 리스너다.
  • ServletContextAttributeListener: ServletContext 객체, 즉 application scope에 속성값이 추가, 변경되는 상황에 동작한다.
  • HttpSessionListener: 세션의 생성과 소멸 이벤트에 따라 동작한다.
  • HttpSessionAttributeListener: 각 세션별로 속성이 추가되거나 변경될 때 동작하는 리스너로, 이들을 이용하면 개별적인 정보 모니터링에 유용하다.
생명 주기 변화나 속성 변화에 따라 동작하는 리스너로 HttpServletRequest도 있다.

리스너 구현

리스너를 구현하기 위해서는 우선 위 표에서 설명한 리스너 인터페이스를 구현한 클래스를 만들어야 한다. 그리고 애너테이션을 이용해 리스너임을 명시한 다음, 오버라이딩된 메서드 중에서 필요한 부분의 코드를 작성하면 된다.

예를 들어 톰캣이 실행되거나 종료될 때 동작하는 리스너를 구현해본다. 우선 ServletContextListener 인터페이스를 구현하는 클래스를 만든다. 클래스 생성은 일반 자바 클래스로 생성하고 implements와 애너테이션을 직접 추가하거나 이클립스에서 제공하는 [New] → [Listener] 메뉴를 통해 생성하는 것도 가능하다.

@WebListenter 애너테이션으로 리스너 클래스임을 컨테이너에 전달하고, 인터페이스 구현으로 생성된 오버라이딩 메서드 중에서 필요한 메서드만 구현해서 사용하면 된다. 예를 들어 웹 애플리케이션 시작(톰캣 시작)에 동작하는 코드는 contextInitialized() 메서드에 작성한다. ServletContext에 대한 접근은 인자로 전달되는 ServletContextEvent 객체의 getServletContext() 메서드로 가능하다.

@WebListener	// 리스너 클래스임을 컨테이너에 전달
public class ListenerExam implements ServletContextListener {
    // ServletContext 시작
    public void contextInitialized(ServletContextEvent sce) {
    	sce.getServletContext().log("ServletContext 시작됨!");
    }
    ...
}

자바의 규격상 여러 인터페이스를 하나의 클래스로 구현하는 것이 가능하기 때문에 여러 이벤트 처리를 하나의 리스너 클래스로 처리할 수 있다는 점도 참고한다.

'Programming > Web' 카테고리의 다른 글

[Web] REST API  (0) 2022.10.26
[Web] 필터(Filter)  (0) 2022.10.26
[Web] JDBC 기본구조와 API의 이해  (1) 2022.10.26
[Web] SQL(DDL, DML)  (0) 2022.10.25
[Web] H2 데이터베이스  (0) 2022.10.24
'Programming/Web' 카테고리의 다른 글
  • [Web] REST API
  • [Web] 필터(Filter)
  • [Web] JDBC 기본구조와 API의 이해
  • [Web] SQL(DDL, DML)
arajo
arajo
  • arajo
    아라 메모장
    arajo
  • 전체
    오늘
    어제
    • 분류 전체보기 (509)
      • Language (298)
        • HTML (55)
        • CSS (11)
        • JavaScript (70)
        • TypeScript (8)
        • Python (33)
        • Java (119)
        • C (0)
        • C# (2)
      • Programming (92)
        • Programming (14)
        • Web (51)
        • Apache (1)
        • MySQL (23)
        • AWS (3)
      • Framework | Library (26)
        • Framework | Library (3)
        • Vue.js (2)
        • React.js (5)
        • React Native (4)
        • Node.js (1)
        • Ajax (1)
        • Bootstrap (8)
        • Spring (1)
        • Flutter (1)
      • etc (2)
      • 휴식 (19)
        • 책 (13)
        • 일기 (5)
        • 게임 일기 (1)
      • A (71)
        • 공부 (18)
        • 기타 (6)
        • 일 (47)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    event
    Java
    파이썬
    web
    타입스크립트
    TypeScript
    next.js
    자바스크립트
    리액트
    array
    변수
    제어문
    HTML
    object
    MySQL
    CSS
    react
    Python
    JavaScript
    객체
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
arajo
[Web] 리스너(Listener)
상단으로

티스토리툴바