반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

스터디 용 블로그

invalidate()은 세션을 소멸시키는 것이 아니라 무효화 시킬뿐이다. 본문

카테고리 없음

invalidate()은 세션을 소멸시키는 것이 아니라 무효화 시킬뿐이다.

워후 2015. 1. 15. 17:10
반응형

흔히 invalidate()를 사용하면 세션객체가 메모리에서 사라지는 것으로 오해할 수 있다.

아마도 "소멸" 이라는 단어가 주는 느낌 때문에 그럴수도 있다.

하지만 자바의 기초를 되짚어 다시한번 생각해보자

JAVA라는 언어는 프로그래머가 메모리 관리를 주도할 수 없도록 가비지 컬렉션을 제공하지 않는가?

그렇다면 invalidate()는 세션객체 자체를 소멸시키는것이 아니라, 세션의 기능을 중단시키고

무효화 시키는것이라고 표현해도 될 것이다.

아래의 예제1을 보면 invalidate()메서드 수행후에도 세션아이디는 여전히 출력이 되기 때문이다.

[예제1]

<%@ page session="true" language="java" contentType="text/html; charset=EUC-KR"%>

<%
String id=session.getId();
out.print("생성된 세션 아이디는"+id+"<br>");
session.invalidate(); // 세션 무효화 시킴 !!
out.print("invalidate() 적용후에도 "+session.getId()+"<br>"); // invalidate() 실행 후에도 ID는 여전히 출력된다

                                                                                    // 즉 객체가 아직 소멸하지 않았다고 보아야 한다.
%>

 

소멸되지 않은 객체이긴 하지만 getSession(false)메서드에 의해 참조되어 질수도 없다 .

아래의 예제를 보자

[예제2]

<%@ page session="true" language="java" contentType="text/html; charset=EUC-KR"%>

<%
String id=session.getId();
out.print("생성된 세션 아이디는"+id+"<br>");
session.invalidate(); // 세션 무효화 시킴 !!
out.print("invalidate() 적용후에도 "+session.getId()+"<br>");
out.print(request.getSession(false).getId());

%>

request.getSession(false) 메서드는 기존에 존재하는 세션을 리턴받는 메서드인데,

이미 무효화된 세션객체를 리턴받으려고 하니 에러가 나는 것이다.

따라서 여기서 혼란을 일으킬수 있으므로 다음과 같이 정리하고 가자

invalidate()메서드는 객체를 메모리에서 삭제할수는 없지만 객체를 무효화 시켜버린다!!

따라서 참조당할 수 없으며, getId() 메서드이외에는 메서드호출 또한 불가하다.

 

메서드 호출에 대한 아래의 실험을 살펴보자

[ 첫번째 예제1 : 올바르게 실행 ]

<%@ page session="true" language="java" contentType="text/html; charset=EUC-KR"%>

<%
String id=session.getId();
out.print("생성된 세션 아이디는"+id);

session.setAttribute("memberID","zino"); // memberID 라는 변수에 zino라는 값을 부여하였다.
String memberID = (String)session.getAttribute("memberID");

out.print("세션에 부여된 memberID 변수값은 "+memberID+"입니다."); // 세션에 부여된 값을 가져올 수 있다.

%>

 

[ 두번째 예제1 : 에러 발생]

<%@ page session="true" language="java" contentType="text/html; charset=EUC-KR"%>

<%
String id=session.getId();
out.print("생성된 세션 아이디는"+id);

session.invalidate(); // 세션 무효화 시킴 !!  아랫줄 부터는 에러 발생 !!!!

session.setAttribute("memberID","zino"); // memberID 라는 변수에 zino라는 값을 부여하였다.
String memberID = (String)session.getAttribute("memberID");

out.print("세션에 부여된 memberID 변수값은 "+memberID+"입니다."); // 세션에 부여된 값을 가져올 수 있다.

%>

 

두번째 예제에서 확인했듯이, 무효화 선언 이후엔 이 세션 객체의 메서드를 더 이상 사용할 수 없다.

즉 세션객체가 역할을 상실한 상태를 일컬어 세션소멸이라고 한다.

개인적으로는 세션소멸보다는 "세션무효화"가 더 나을것 같다.

아마 그래서 메서드명도 invalid (효력이 없는) 으로 정했을지도 모른다는 생각이 든다 ^^ 

출처 | Value Creator



반응형
Comments