[Servlet] 리스너(Listener)에 대해 살짝 알아보기
프로젝트를 하다가 새로운 로그인이 되었을 때 로그를 남기는 것을 알아보다가 서블릿 API에 리스너 인터페이스가 존재한다는 것을 찾았다!
리스너(Listener)
리스너 객체들은 이벤트가 발생하면 자동으로 실행된다. (MVC도 리스너를 통해 작동한다고 한다.)
어떤 작업의 영향으로 다른 작업도 실행되어야 하는 경우가 있는데 이럴 때 리스너를 사용한다.
-> 옵저버 패턴(observer) : 객체를 보관하고 있다바 이벤트가 발생하면 객체를 실행
서블릿 API에는 여러 이벤트에 맞는 리스너를 인터페이스로 정의해 두었다.
1. ServletContextListener
웹 애플리케이션이 시작되거나 종료될 때 특정한 작업을 수행
ServletContextListener와 ServletContext를 이용하면 프로젝트가 실행될 때 필요한 객체를 준비하는 작업을 할 수 있다.
예) 커넥션 풀 초기화, 객체 미리 생성해서 보관 등
*참고: 스프링 프레임워크도 웹 프로젝트에서 미리 로딩하는 작업을 처리할 때 ServletContextListener를 이용한다.
방법 1. @WebListener 어노테이션
@WebListener
class 클래스명 implements ServletContextListener { // default 메소드가 들어있음
@Override
public void contextInitialized(ServletContextEvent e) { // 웹어플리케이션에 필요한 자원객체 생성
log.info("--init--");
}
@Override
public void contextDestroyed(ServletContextEvent e) { // 사용했던 자원객체 해제
log.info("--destroy--");
}
}
- 클래스 내부에서 contextInitialized()와 contextDestroyed()를 오버라이드 한다.
- ServletContextEvent는 현재 애플리케이션이 실행되고 있는 공간인 ServeletContext로 접근할 수 있다.
- ServeletContext는 현재 웹 애플리케이션 내 모든 자원을 사용하는 공간임 (컨트롤러, JSP 등에서 활용가능)
- ServeletContext에 저장된 객체는 서블릿 JSP/EL에서 사용가능!
방법2. web.xml에 태그로 등록
<listener>
<listener-class>com.example.project.listener.클래스명</listener-class>
</listener>
- <listener> 태그를 사용해 ServletContextListener를 구현한 클래스를 등록
2. HttpSessionListener
HttpSession에 특정한 작업에 대한 감시와 처리
3. HttpSessionAttributeListener
HttpServeletRequest에 특정한 작업에 대한 감시화 처리
- attributeAdded(), attributeRemoved(), attributeReplaced()를 이용해서 HttpSession에 setAttribute()/removeAttribute()등의 작업을 할 수 있다.
내가 적용한거
@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 logined !!!");
log.info(obj);
}
}
}
로그인이 발생하면 로그에 메시지가 출력된다 !