본문으로 바로가기

[HttpServletResponse / HttpServletRequest] scope 스코프(영역)

category Servlet&JSP 2020. 1. 10. 11:52

jsp에서 기본으로 제공해주는 객체 중에서
HttpServletRequest, httpSession, servletContext type 객체가 있다.
해당 참조값은 각각 request, session, application 이라는 이름의 지역변수(local variable)에 들어 있다.
때로는 어떤 data를 각각의 객체에 저장하고 읽어낼 필요가 있다.


예) 어떤 사이트에 로그인시 다음 페이지 이동할때 재로그인할 필요가 없다.
서버는 클라이언트가 요청을 하면 요청을 받아들이고 후 연결을 끊어버리고, 응답을 하고 연결을 끊어버린다.
이때 서버에서 필요한 처리는 클라이언트가 로그인을 했는지 정보를 기억(저장)할 필요가 있다.
(특정 범위내에서 어떤 데이터를 저장해 놓을 필요가 있음)

 

만약 java class라면 HttpServletRequest, httpSession, servletContext type 객체가 제공되지 않고 부모객체인 ServletRequest와 ServletResponse가 제공된다. 

java class에서 HttpServletRequest, httpSession, servletContext type 객체의 메소드를 사용하고 싶다면 casting을 해주어야한다.

 

  • request - 응답을 하기 전까지의 정보를 기억함. 응답한 후에는 메모리에서 지워짐. 주로 1회성 데이터를 저장한다.
  • session - 웹 브라우저를 닫기 전까지(session이 종료되기 전까지) 정보를 기억함. 주로 로그인 정보를 저장할때 사용한다.
  • application - 서버를 껐다키기 전까지의 정보를 기억함. 

 

//정보 저장할 메소드
request.setAttribute("key", "value");

//저장된 정보를 가지고올 메소드
session.getAttribute("key");

//저장한 정보를 강제로 삭제하는 메소드
//request에 특정 키값으로 저장된 data 삭제 하기
request.removeAttribute("key");
//session에 특정 키값으로 저장된 data 삭제 하기
session.removeAttribute("key");
// 만일 여러개를 한번에 다 지우고 싶다면
session.invalidate(); //session 초기화

 

 

 

[예시]

<테스트 준비>

1. test3/ home.jsp, test3/ other.jsp, test3/ reset.jsp

 페이지를 준비한다.

// test3/home.jsp
<body>
<h1>scope 테스트 home</h1>
<ul>
	<li><a href="other.jsp">다른 페이지로 이동!</a></li>
</ul>
</body>
// test3/ other.jsp
<body>
	<p>myName : <strong><%=myName %></strong></p>
	<p>yourName : <strong><%=yourName %></strong></p>
	<p>ourName : <strong><%=ourName %></strong></p>
	<a href="reset.jsp">모든 영역에 있는 내용 삭제하기</a>
</body>
// test3/reset.jsp
<body>
  <p>모든 영역에 있는 내용을 삭제 했습니다.</p>
  <a href="other.jsp">확인하러 가기</a>
</body>

 

test3/ home.jsp 페이지에 setAttribute(key, value) 메소드를 사용하여 정보를 저장한다.

test3/ home.jsp 페이지를 로딩할때 java코드가 실행되면서 메모리에 key와 value 값이 저장된다.

<body>
<%
	//setAttribute(key, value);
	request.setAttribute("myName", "김구라");
	session.setAttribute("yourName", "해골");
	application.setAttribute("ourName", "원숭이");
%>
<h1>scope 테스트 home</h1>
<ul>
	<li><a href="other.jsp">다른 페이지로 이동!</a></li>
</ul>
</body>

test3/ other.jsp 페이지에서는 출력 메모리에 저장한 정보를 getAttribute()메소드를 사용하여 얻어내고

페이지에 출력해본다.

<body>
<%
	//getAttribute()메소드의 return type이 Object 이므로 원하는 type에 담으려면 반드시 casting을 해주어야한다.
	//request에 담긴 String type 얻어내기
	String myName=(String)request.getAttribute("myName");
	//session에 담긴 String type 얻어내기
	String yourName=(String)session.getAttribute("yourName");
	//application에 담긴 String type 얻어내기
	String ourName=(String)application.getAttribute("ourName");

%>
	<p>myName : <strong><%=myName %></strong></p>
	<p>yourName : <strong><%=yourName %></strong></p>
	<p>ourName : <strong><%=ourName %></strong></p>
	<a href="reset.jsp">모든 영역에 있는 내용 삭제하기</a>
</body>

test3/ home.jsp 페이지 에 접속하는 순간 etAttribute(key, value) 메소드가 실행되면서 메모리에 key와 value값으로 보낸 정보들이 저장된다.

 

 

다른 페이지로 이동 링크를 클릭해보면

 

 

 

request.setAttribute("myName", "김구라");

request 객체는 응답하기 전까지의 정보만 기억하므로 이미 test3/ home.jsp 페이지 에 대한 응답이 완료된 시점에는 메모리에서 해당 정보는 지워진다.

따라서 전달한 myName key에 담겨져 있던 정보는 null로 나온다. 

 

 


session.setAttribute("yourName", "해골"); application.setAttribute("ourName", "원숭이"); 정보는 메모리에 저장되어 있다.

session.setAttribute("yourName", "해골");

session 객체의 setAttribute() 메소드는 웹 브라우저를 닫기 전까지의 정보를 기억한다. URL을 복사한 뒤 인터넷 브라우저를 모두 껐다가 다시 페이지를 로딩하면 메모리에 저장되어 있던 내용이 삭제된 것을 확인할 수 있다.

 

 

 


test3/ reset.jsp 페이지에서는 메모리에 기억된 정보를 지우는 메소드가 작성되어 있다.

<body>
<%
	//request에 특정 키값으로 저장된 data 삭제 하기
	request.removeAttribute("myName");
	//session에 특정 키값으로 저장된 data 삭제 하기
	session.removeAttribute("yourName");
	// 만일 여러개를 한번에 다 지우고 싶다면
	session.invalidate(); //session 초기화
%>
<p>모든 영역에 있는 내용을 삭제 했습니다.</p>
<a href="other.jsp">확인하러 가기</a>
</body>

test3/ other.jsp 페이지 에서 "모든 영역에 있는 내용 삭제하기" 링크를 누르면 test3/ reset.jsp 페이지 로 실행순서가 들어와 메모리에 있는 내용을 삭제하도록 코드를 작성하였다.

테스트를 해보면 아래와 같은 화면이 나온다.

 

 

 

session.setAttribute("yourName", "해골");

removeAttribute()메소드로 메모리에 저장되어 있던 내용을 삭제했기 때문에 null로 표기되고 있다.

 

session.invalidate()은 session을 초기화 하는 메소드로 key와 value로 전달되던 것 외에 다른 정보들도 모두 삭제해주고 싶다면 invalidate()메소드를 사용하면 편리하다.