이전글


HttpSessionBindingListener 바운드와 언바운드 조건
UserInfo 클래스가 다음과 같이 HttpSessionBindingListener를 구현하였다고 하였을때 valueBound()와 valueUnbound() 메서드가 호출되는 조건에 대하여 알아보도록 하겠습니다.
package listener;
 
 
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
 
 
public class UserInfo implements HttpSessionBindingListener {
 
     String id;
     String password;
 
     // 기본 생성자가 꼭 있어햐 함
     public UserInfo() {
     }
 
 
     public UserInfo(String id, String password) {
           this.id = id;
           this.password = password;
     }
 
     public String getId() {
           return id;
     }
 
     @Override
     public void valueBound(HttpSessionBindingEvent hsbe) {
           System.out.println("UserInfo 객체가 세션에 바인딩됨");
     }
 
     @Override
     public void valueUnbound(HttpSessionBindingEvent hsbe) {
           System.out.println("UserInfo 객체가 세션에서  언바인딩(제거됨)");
     }
 
}
cs

 

 

 



valueBound() 호출 조건
먼저 valueBound()HttpSession#setAttribute(name, value) 메서드를 통하여 특정한 name에 대해 새로운 리스너 구현체가 바인딩 되는 경우입니다.

만약 LoginServlet에서 로그인시 아래와 같이 같은 name으로 같은 리스너 구현 객체를 두 번 setAttribute()를 호출했다면 어떨까요? 이때는 valueBound()한 번 호출됩니다.
UserInfo userInfo = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo", userInfo);
cs


만약 다른 name으로 같은 리스너를 바인딩 한 경우는 어떨까요? 이때는 valueBound()두 번 호출됩니다. 리스너 인스턴스는 하나지만 새로운 name으로 세션에 바인딩 되었기 때문입니다.
UserInfo userInfo = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo2", userInfo);
cs


마지막으로 같은 name에 대해 새로운 리스너 인스턴스를 바인딩 한 경우입니다. 
UserInfo userInfo = new UserInfo(id, password);
UserInfo userInfo2 = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo", userInfo2);
cs

이 경우 기존에 있던 UserInfo 객체가 새로운 UserInfo로 세션에 바인딩 되므로 valueBound()가 두 번 호출되며, 처음의 UserInfo는 언바인딩 되어 valueUnbound()가 호출되었습니다.






valueUnbound() 호출 조건
먼저valueUnbound()HttpSession#removeAttribute(name) 메서드를 통하여 리스너 객체가 세션에서 제거되었거나 HttpSession#invalidate()메서드로 세션 자체가 제거되면서 세션에 바인딩 된 리스너 객체가 제거된 경우 호출됩니다.

추가적으로 앞서 보았던 같은 Attribute name에 대해 새로운 리스너 객체가 바인딩 되는 경우입니다.
UserInfo userInfo = new UserInfo(id, password);
UserInfo userInfo2 = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo", userInfo2); //새로운 리스너 객체 바인딩. 기존의 userInfo는 언바인딩 됨
cs


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,