티스토리 뷰
이전 글에서는 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으로만 변경했다.
출력 결과는 역시 동일하다. 그렇다면 완전히 똑같은 객체인데 왜 두 개나 만들어놨을까 쓸데없이??
아니다!
Application객체 vs Session객체 차이점에 대해서 알아보자!
Application객체는 전역, 그러니깐 모든 서블릿에서 사용할 수 있다.
Session객체는 개인마다 가지고 있는 컨테이너이다.
예를 들어서 Applicaition에서 누군가가 동시에 사용하고 있다면 저장된 값들이 공유되게 된다.
하지만 Session객체에서는 동시에 사용하고 있더라도 그 값들은 공유될 수가 없다.
확인을 위해서 같은 브라우저(동일 사용자)로,
다른 브라우저로(다른 사용자) 접속해보면 간단하게 확인해 볼 수 있다.
그런데 session을 웹서버가 어떻게 구분할 수 있을까?
순서대로 한번 보도록 하자.
사용자가 맨 처음 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 |