삶 가운데 남긴 기록 AACII.TISTORY.COM
리스너(Listener) : 옵저버(observer) 패턴 본문
애플리케이션이 어떤 작업의 영향으로 다른 작업도 자동으로 같이 실행되어야 하는 경우가 종종 있습니다.
이를 위해서 자바에서는 옵저버 패턴을 사용합니다.
특정한 구독자(subscriber)들을 보관하고 있다가 이벤트를 발행(publish)하면 구독자들이 실행하는 방식입니다.
ServletContext Listener
서블릿 API는 여러 이벤트에 맞는 리스너들을 인터페이스로 정의해두었습니다.
이를 이용해서 애플리케이션이 시작되거나 종료될 때 특정 작업을 수행하거나, session에 특정한 작업에 대한 감시와 처리, request에 특정한 작업에 대한 감시와 처리들을 할 수 있습니다.
import lombok.extern.log4j.Log4j2;
import javax.servlet.annotation.WebListener;
@WebListener
@Log4j2
public class W2AppListener implements javax.servlet.ServletContextListener {
@Override
public void contextInitialized(javax.servlet.ServletContextEvent sce) {
log.info("Servlet initialized");
}
@Override
public void contextDestroyed(javax.servlet.ServletContextEvent sce) {
log.info("Servlet destroyed");
}
}
그리고 웹 앱을 실행하면 시작과 종료시 로그가 발생하는 것을 확인 할 수 있습니다.
이 contextInitialized()와 contextDestroyed()에는 파라메터로 ServletContextEvent가 전달됩니다.
ServletContext는 웹 애플리케이션의 모든 공유자원들이 있는 공간이므로 여기에 저장된 정보들은 모든 컨트롤러나 JSP/EL 등에서 접근해서 사용할 수 있습니다.
@Override
public void contextInitialized(javax.servlet.ServletContextEvent sce) {
log.info("Servlet initialized");
ServletContext servletContext = sce.getServletContext();
//애플리케이션 전역에서 사용할 수 있는 정보 등록
servletContext.setAttribute("appName", "example");
}
예를 들어 위처럼 servletContext에 setAttribute() 메소드를 이용해서 값을 설정한 다음 아래 예제처럼 컨트롤러나 jsp 같은 곳에서 활용할 수 있습니다.
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
ServletContext servletContext = req.getServletContext();
log.info("[doGet()]"+servletContext.getAttribute("appName"));
}
<html>
<body>
<h2>${appName}</h2>
</body>
</html>
Spring framework에서도 웹 프로젝트에서 미리 로딩하는 작업을 처리할 때 ServletContextListener를 이용합니다.
세션 관련 리스너
서블릿 리스너 중에서는 HttpSession 관련 작업을 감시하는 리스너를 등록할 수 있습니다.
HttpSessionListener나 HttpSessionAttributeListener 들이 있습니다.
이를 이용해서 세션이 생성되거나 setAttribute()가 실행될 때 이를 감지할 수 있습니다.
import lombok.extern.log4j.Log4j2;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener
@Log4j2
public class LoginListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
String name = event.getName();
Object obj = event.getValue();
if(name.equals("loginInfo")) {
log.info("A user logged in.");
log.info(obj);
}
}
}
'DEV&OPS > Java' 카테고리의 다른 글
| Spring 의존성 주입과 제어의 역전 (1) | 2025.11.03 |
|---|---|
| Singleton Pattern 과 DeadLock (22) | 2025.11.01 |
| Jenkins로 AWS에 배포 (0) | 2025.11.01 |
| Jenkins (젠킨스) (0) | 2025.11.01 |
| build.gradle 의 기본 (0) | 2025.10.30 |
