티스토리 뷰

반응형

이전 글에서는 Application 객체에 대해서 다루었다.
이번 글에서는 Session객체에 대해서 알아보자!

//Calc2.java
package com.newlecture.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/calc2")
public class Calc2 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//ServletContext application = request.getServletContext(); //ServletContext 변수 application을 선언
		HttpSession session = request.getSession(); //HttpSession 변수 session을 선언
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		
		String v_ = request.getParameter("v");
		String btn = request.getParameter("button");
		
		int v = 0;
		if(!v_.equals("")) v = Integer.parseInt(v_);
						
		//계산
		if(btn.equals("=")) {
			//int x = (Integer) session.getAttribute("value"); //object로 값을 반환하기 때문에 (Integer)라는 refer클래스로 해결!
			int x = (Integer) session.getAttribute("value"); //object로 값을 반환하기 때문에 (Integer)라는 refer클래스로 해결!
			int y = v; //위의 조건문으로부터 받아온 값
			//String button = (String) session.getAttribute("btn"); //지역변수 이름을 button으로 설정해서 다른 지역변수와 충돌을 없앤다.
			String button = (String) session.getAttribute("btn"); //지역변수 이름을 button으로 설정해서 다른 지역변수와 충돌을 없앤다.
			
			int result = 0;
			
			if(button.equals("+")) result = x + y;
			else result = x - y;
			
			response.getWriter().printf("Result is %d\n", result);
			
		}
		
		//저장
		else {
//			application.setAttribute("value", v); //application변수에 value이라는 이름으로 v값을 저장한다.
//			application.setAttribute("btn", btn); //application변수에 btn이라는 이름으로 btn값을 저장한다.	
			session.setAttribute("value", v); //session변수에 value이라는 이름으로 v값을 저장한다.
			session.setAttribute("btn", btn); //session변수에 btn이라는 이름으로 btn값을 저장한다.	
			response.getWriter().println(v); //전달 값 숫자
			response.getWriter().println(btn); //전달 값 버튼
		}
		
		}
	}
	


코드는 application을 그대로 session으로만 변경했다. 

session사용 출력 결과

출력 결과는 역시 동일하다. 그렇다면 완전히 똑같은 객체인데 왜 두 개나 만들어놨을까 쓸데없이??
아니다!
Application객체 vs Session객체 차이점에 대해서 알아보자!

application과 session의 차이


Application객체는 전역, 그러니깐 모든 서블릿에서 사용할 수 있다.
Session객체는 개인마다 가지고 있는 컨테이너이다. 
예를 들어서 Applicaition에서 누군가가 동시에 사용하고 있다면  저장된 값들이 공유되게 된다.
하지만 Session객체에서는 동시에 사용하고 있더라도 그 값들은 공유될 수가 없다.
확인을 위해서 같은 브라우저(동일 사용자)로,
다른 브라우저로(다른 사용자) 접속해보면 간단하게 확인해 볼 수 있다. 

그런데 session을 웹서버가 어떻게 구분할 수 있을까? 

세션 ID와 사용자 저장소 구별

순서대로 한번 보도록 하자. 
사용자가 맨 처음 WAS에 application공간은 이용 할 수 있지만, Session(개안 캐비닛 같은) 공간에 Add를 요청할 수가 없다. 왜냐하면 SID(SessionID)가 없기 때문이다. 하지만 그 WAS에서 나올때 사용자에게 SID(107번 캐비닛을 할당)를 부여해준다. 그리고 사용자가 다시 WAS로 Add를 요청하면 SID(107번 개인 캐비닛)를 보고 바로 저장소를 이용할 수 있게 해 준다.

하지만 또 계속해서 사용할 수 있는 것은 아니다.

세션 메서드(Session Method)를 보면 알 수 있다.
void setAttribute(String name, Object value) => 지정된 이름으로 객체를 설정
Object getAttribute(String name) => 지정한 이름의 객체를 반환
void invalidate() => 세션에서 사용되는 객체들을 바로 해제
void setMaxInactiveInterval(int interval) => 세션 타임아웃을 정수(초)로 설정, 기본은 30분 단위
boolean isNew() => 세선이 새로 생성되었는지를 확인
Long getVreationTime() => 세션이 시작된 시간을 반환
Long getLastAccessedTime() => 마지막 요청 시간

보통은 사용자가 브라우저를 30분간 사용하지 않으면 자동으로 SID(캐비닛)을 비워버린다.
계속 공간을 차지하게 둘 수는 없으니깐~! 

아무튼 이렇게 Session과 Application의 차이와 Session을 WAS가 어떻게 구분하는지에 대해서 알아보았다

반응형

'Servlet JSP' 카테고리의 다른 글

Cookie 옵션 Path  (0) 2021.04.24
상태유지 Cookie(자바 공부도 해야되는데.... 코드 어렵)  (0) 2021.04.23
상태유지 Application 이용  (0) 2021.04.23
상태 유지의 필요성?  (0) 2021.04.23
입력 데이터 배열 전달  (0) 2021.04.23
댓글
공지사항