finerss's world!


세션 생명주기 이벤트

 이정표  이벤트와 리스너 유형
 
생명주기

     -세션 생성
     컨테이너가 세션을 생셩했을 떄 이시점까지 새션은 여전히 새것(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