JSP

[JSP] 19. 리스너

Song hyun 2024. 7. 3. 10:52
728x90
반응형

[JSP] 19. 리스너

 

 

1. 리스너란?

-> 리스너는 특정 이벤트가 발생했을 때 이를 감지하고, 그에 대응하는 작업을 수행하는 자바 객체이다. 리스너는 서블릿 컨테이너에서 발생하는 다양한 이벤트를 처리할 수 있다.

 


2. 리스너를 사용하는 이유?

-> 리스너는 웹 애플리케이션의 상태 변화를 감지하여, 다음과 같은 작업을 수행할 수 있게 도와준다.

  • 초기화 작업(애플리케이션 시작 시 필요한 리소스 로드)
  • 정리 작업(애플리케이션 종료 시 리소스 해제)
  • 세션 관련 작업(로그인/로그아웃 로깅, 세션 속성 변경 감지)


3. 주요 리스너 인터페이스

  • ServletContextListener: 애플리케이션 시작 및 종료 이벤트를 처리한다.
  • HttpSessionListener: 세션 생성 및 소멸 이벤트를 처리한다.
  • ServletRequestListener: 요청 객체의 생성 및 소멸 이벤트를 처리한다.

 

4. 시나리오 코드

package com.tenco.listeners;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterRegistration;
import jakarta.servlet.FilterRegistration.Dynamic;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRegistration;
import jakarta.servlet.SessionCookieConfig;
import jakarta.servlet.SessionTrackingMode;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.descriptor.JspConfigDescriptor;

/*
 * 리스너 사용해보기
 * 동작 트리거, web.xml 파일과 어노테이션 기반으로 설정 가능
 */
@WebListener
public class AppLifecycleListener implements ServletContextListener{
	
	private static final Logger logger=Logger.getLogger(AppLifecycleListener.class.getName());
	
	// 애플리케이션이 언제 시작을 했는지 로그, 파일을 남겨야 될 때 사용
	@Override
		public void contextInitialized(ServletContextEvent sce) {
			System.out.println("---------------------------");
			logger.info("웹 애플리케이션 시작됨 >>>"+System.currentTimeMillis());
			System.out.println("---------------------------");
		}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("---------------------------");
		logger.info("웹 애플리케이션 종료됨 >>>"+System.currentTimeMillis());
		System.out.println("---------------------------");
	}

}

 

package com.tenco.listeners;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterRegistration;
import jakarta.servlet.FilterRegistration.Dynamic;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRegistration;
import jakarta.servlet.SessionCookieConfig;
import jakarta.servlet.SessionTrackingMode;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.descriptor.JspConfigDescriptor;

/*
 * 리스너 사용해보기
 * 동작 트리거, web.xml 파일과 어노테이션 기반으로 설정 가능
 */
@WebListener
public class AppLifecycleListener implements ServletContextListener{
	
	private static final Logger logger=Logger.getLogger(AppLifecycleListener.class.getName());
	
	// 시간 포매터
	private String timeFormat() {
		// yyyy-mm-dd HH:mm:ss
		Date nowtime=new Date();
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
		String printTime=dateFormat.format(nowtime);
		return printTime;
	}
	
	
	// 애플리케이션이 언제 시작을 했는지 로그, 파일을 남겨야 될 때 사용
	@Override
		public void contextInitialized(ServletContextEvent sce) {
			System.out.println("---------------------------");
			logger.info("웹 애플리케이션 시작됨 >>>"+timeFormat());
			System.out.println("---------------------------");
		}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("---------------------------");
		logger.info("웹 애플리케이션 종료됨 >>>"+timeFormat());
		System.out.println("---------------------------");
	}

}

 

package com.tenco.listeners;

import java.util.logging.Logger;

import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;

/*
 * 세션이 생성될 때/감지할 때 사용! => 리스너 등록
 */
@WebListener
public class MySessionListener implements HttpSessionListener{

	private static final Logger logger=
			Logger.getLogger(MySessionListener.class.getName());
	
	
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// 세션 생성 시 실행됨
		logger.info("새로운 세션이 생성 됨 : "+se.getSession().getId());
		se.getSession().setAttribute("LoginTime", System.currentTimeMillis());
	}
	
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// 세션 소멸 시 실행됨
		Long loginTime=(Long)se.getSession().getAttribute("LoginTime");
		Long logoutTime=System.currentTimeMillis();
		if(loginTime!=null) {
			Long sessionDurationMs=logoutTime-loginTime; // 접속시간 계산 (밀리초 단위)
			double sessionDurationMsSec=sessionDurationMs/1000; // 초 단위로 변환
			System.out.println("세션 지속 시간 : "+sessionDurationMsSec);
		}
	}
	
}

 

package com.tenco.controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

@WebServlet("/session-test")
public class SessionTestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public SessionTestServlet() {
    }


    // 주소 설계 - http://localhost:8080/fl/session-test
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 새로운 세션을 생성해보아용
		HttpSession session = request.getSession();
		response.setContentType("text/plain;charset=UTF-8");
		response.getWriter().print("당신의 세션 아이디는  : "+session.getId());
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
728x90
반응형