<상태 유지의 필요성>

웹 서버 프로그램의 경우 일반 애플리케이션과 다르게 조각나 있는 상태와 같기 때문에
클라이언트로부터 데이터를 요청받고 응답한 뒤 서블렛 조각 프로그램은 종료되어버린다.
그러한 이유로 서블렛 간의 작업을 이어가기 위해서는 전역 변수와 같은 개념이 필요한데, 그러한 것을 위해 사용되는 객체들이 있다.



= Application, Session, Cookie  (기타_Hidden input, Querystring) =



Application 저장소 : 서블릿 컨텍스트(Context)
-어플리케이션(모든 서블릿) 전역에서 사용 가능


ServletContext application = request.getServletContext();
-서블릿 컨텍스트 생성

application.setAttribute("value", v);
application.setAttribute("operator", op);
-서블릿 컨텍스트에 객체 저장하기 (컬렉션의 Map과 같은 방식으로 저장된다)

application.getAttribute("value");
application.getAttribute("operator");
-서블릿 컨텍스트에 저장된 객체 가져오기 (말그대로 객체로 가져오므로 연산을 하려면 형변환이 필요하다)



Session 객체로 상태 값 저장하기
-세션(현재 접속한 사용자) 별로 사용 가능
(동일 브라우저 창은 다중 스레드로 구성되어 동일 세션을 사용하나, 다른 브라우저 끼린 다른 세션을 사용한다)
(세션의 사용자는 첫 response에 SID를 서버로부터 받아 이후의 요청에 사용한다)
(브라우저 개발자 도구의 network > cookie 에서 SID를 확인할 수 있다)


HttpSession session = request.getSession();
-세션 생성

session.setAttribute("value", v);
session.setAttribute("operator", op);
session.getAttribute("value");
session.getAttribute("operator");
-사용법은 서블릿 컨텍스트와 같다.

void setAttribute(String name, Object value)
-지정된 이름으로 객체를 설정

Object getAttribute(String name)
-지정한 이름의 객체를 반환

void invalidate()
-세션에서 사용되는 객체들을 바로 해제

void setMaxInactiveInterval(int interval)
-세션 타임아웃을 정수(초)로 설정

boolean isNew()
-세션이 새로 생성되었는지를 확인

Long getCreationTime()
-세션이 시작된 시간을 반환, 1970년 1월 1일을 시작으로 하는 밀리초

long getLastAccessedTime()
-마지막 요청 시간, 1970년 1월 1일을 시작으로 하는 밀리초

(세션 사용자들의 데이터를 항상 서버에서 저장하고 있을 수는 없기 때문에 위와 같은 추가 메소드를 사용한다)



Cookie를 이용해 상태 값 유지하기
-Application, Session이 서버 측에서 만들어지는 저장소라면 쿠키는 사용자(클라이언트) 브라우저에서 저장한다


Cookie(브라우저) === TCP/IP 정보, 헤더정보(브라우저가보냄), 사용자데이터 ===> 서버
서버 === 헤더정보 ===> Cookie

request.getHeader("remote-host")
-헤더 정보 가져오기
request.getParameter("x")
-사용자데이터 가져오기


Cookie cookie = new Cookie("c", String.valueOf(result));
response.addCookie(cookie);
-쿠키 저장하기(저장시키기 혹은 저장요청하기...)(쿠키는 문자열 형태로만 저장할 수 있기에 형변환 시켜준다)

Cookie[] cookies = request.getCookies();
String _c = "";
if (cookies != null)
  for (Cookie cookie : cookies)
    if("c".equals(cookie.getName()))
      _c = cookie.getValue();
-쿠키 읽기

cookie.setPath("/");
-쿠키 적용 url 설정하기
( "/" 모든 서블렛, "/abc" abc 주소가 요청할때만, "/abc/" abc가 포함된 모든 하위 서블렛 )

cookie.setMaxAge(int second);
-쿠키 수명 설정하기 

(0으로 설정시 즉시 삭제된다)
(기본값 : 브라우저의 생존주기와 같음)
(설정시 브라우저가 닫혀도 외부파일로 남아 설정한 시간동안 유지된다)

ex)
Cookie[] cookies = request.getCookies();
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/");
valueCookie.setMaxAge(24*60*60);
opCookie.setPath("/");
response.addCookie(valueCookie);
response.addCookie(opCookie);



Application, Session, Cookie의 차이점 정리

  사용범위 생명주기 저장위치
               Application 전역 범위 에서 사용하는 저장 공간 WAS가 시작해서 종료할 때까지 WAS 서버의 메모리
                 Session 세션 범위에서 사용하는 저장 공간 세션이 시작해서 종료할 때까지 WAS 서버의 메모리
                  Cookie Web Browser별 지정한 path 범주 공간 Browser에 전달한 시간부터 만료시간까지 Web Browser의 메모리 또는 파일



오랜시간 저장해야하는 데이터라면 무조건 Cookie로 저장한다.
특정범위, 특정URL에서만 사용하는 데이터 또한 Cookie로 저장한다.

'Development > Java' 카테고리의 다른 글

Servlet & JSP (method) #4  (0) 2022.08.13
Servlet (service, doGet, doPost) #3  (0) 2022.08.13
Servlet #1  (0) 2022.08.11
Tomcat  (0) 2022.08.11
JDBC  (0) 2022.08.07

+ Recent posts