Session Listener(세션 리스너)
공부/Sevlets&JSP2011. 6. 30. 15:52
세션 생명주기 이벤트
이정표 | 이벤트와 리스너 유형 |
생명주기 -세션 생성 컨테이너가 세션을 생셩했을 떄 이시점까지 새션은 여전히 새것(new) 으로 간주된다(왜냐하면, 클라이언트가 세션ID를 가진 요청을 아직 보내지 않았기 떄문이다). -세션 소멸 컨테이너가 세션을 무효화했을 때(세션이 타임아웃 되었거나 또는 다른 애플리케이션에서 invalidate()메소드를 호출했을 경우) |
HttpSessionEvent HttpSessionListener |
속성 -속성 추가 세션의 setAttribute()를 호출했을때. -속성 제거 세션의 removeAttribute()를 호출했을때. -속성 대체 세션의 setAttribute()를 호출했을때. 동일 속성 이름이 이미 존재하는 경우에. |
HttpSessionBindingEvent HttpSessionAttributeListener |
이동 - 세션이 비활성화(passivate)되려고 할떄 컨테이너가 세션을 다른VM으로 옮기려고 할 때. 세션이 옮겨지기 바로 전에 호출되어, 세션이 가지고 있는 속성들도 옮길 준비를 함 -세션이 활성화 될때 컨테이너가 세션을 다른 VM으로 옮기고 난 다음. 세션의 getAttribut() 를 호출하기 바로 직전에 호출되어 속성들이 리턴할 준비를 함. |
HttpSessionEvent HttpSessionActivationListener |
HttpSessionBindingListener
위에 나와있는 이벤트는 세션의 일생중 중요한 순간들이다
HttpSessionBindingListener는 세션이 아닌 세션 속성의 중요 순간들에 대하여 리스닝한다.
속성이 세션에 추가될 떄 속성의 정보를 데이터베이스에서 읽어 온다든지,
아니면 세션에서 제거될 떄 속성의 정보로 데이터베이스를 업데이트한다든지 할 떄 사용 한다.
코드를 보면
package com.example; import javax.servlet.http.*; public class Dog implements HttpSessionBindingListener { //Dog라는 속성 클래스는 HttpSessionBindingListener이기도 하다. Dog객체가 세션에 추가되거나 제거될 떄를 리스닝 하고있다. private String breed; public Dog(String breed){ this.breed=breed; } public String getBreed() { return breed; } public void valueBound(HttpSessionBindingEvent event) { //"Bound"라는 말은 이 속성을 세션에 추가했다는걸 의미 //세션에 추가 되었을 때 실행될 코드 } public void valueUnbound(HttpSessionBindingEvent event){ //속성을 세션에서 제거했다는걸 의미 //세션에서 제거되었을 떄 실행될 코드 } } |
*세션 바인딩 리스너는 DD에서 설정하지 않는다.
Dog와 같은 속성 클래스가 HttpSessionBindingListener를 구현하면, 컨테이너는 이 객체가 세션에 추가되거나 제거될떄
관련 콜백 메소드(valueBound(), valueUnBound())를 호출한다. 이걸로 끝이다
하지만 HttpSessionListenner, HttpSessionActivationListener는 DD에 등록해야한다
왜냐하면 이들은 세션 안에 추가되는 개별 속성들이 아니라 세션 그 자체에 관련된 것이기 떄문이다.
세션 이동
클러스트링 환경 하에서, 컨테이너는 클라이언트의 요청을 몇몇의 JVM으로 분산하여 넘기는 로드밸런싱 환경을 구현한다
그림으로 간단하게 보면
세션 이동 및 직렬화
컨테이너는 직렬화가 구현된 속성은 별다른 코딩을 하지않더라도 옮길수 있어야 한다.
(속성에 있는 모든 인스턴스는 직렬화되거나 아니면 null이어야한다는 말이다)
그렇다고 해서 컨테이너가 HttpSession 객체를 옮기기 위하여 꼭 직렬화를 요구하는것은 아니다.
이게무슨말이냐하면 속성 클래스를 직렬화 하라는 뜻이다.
직렬화가 되있지않았다면(전부다가 아니라도, 속성 인스턴스 변수중 하나라도 직렬화 되지 않았을 경우에도)
속성 객체를 HttpSessionActivationListener 로 구현한수 활성화(activation)/비활성화(passivation) 콜백 메소드를 가지고 이동할수 있게하면 된다.
*리스너종류와 메소드 가궁금하면 API를 찾아 보자
'공부 > Sevlets&JSP' 카테고리의 다른 글
JSP API 와 속성 (0) | 2011.07.01 |
---|---|
JSP 기초 (0) | 2011.07.01 |
세션(sisson) 관리 (0) | 2011.06.29 |
RequestDispatcher (0) | 2011.06.29 |
동기화 (0) | 2011.06.29 |