-
Servlet-JSP MVC02(4) - Application,Session,CookieWeb/Servlet-JSP 2023. 6. 12. 18:16
- 서블릿 컨테이너의 임시저장소
서블릿사이에 자원을 공유하기 위한 임시저장소들에 대해 앞서 간단하게 알아보았는데,
조금 더 자세하게 이들에 대해 알아보도록 하자
1. Application
> Servlet Context라고도 불리는 Application은 WAS의 하나의 웹프로젝트 내에 서블릿 컨테이너에
계속 존재하면서 값을 저장해둔다.
> Context라는 말은 Context Path에서 처럼 하나의 웹프로젝트에서의 문맥으로 ContextPath는 WAS내에 웹프로젝트들과 그에 따른 요청을 구별하게 해주는 하나의 문맥, 줄기의 설정이었다면, (ex /MVC01/list.do와 /MVC02/list.do를 구별하게 해주는 역할) Servlet Context는 계속 이어갈 수 있는 상태에 대한 설정을 위한 장소이다.
사용범위 - 전역
생명주기 - WAS의 시작에서 종료까지
저장위치 - WAS 서버의 메모리
사용법 - 컨트롤러에 request객체를 통해 application객체를 얻을 수 있고, 이를 통해 값을 저장할 수 있다.
//어플리케이션 생성하기 ServletContext application = request.getServletContext(); // application얻기 //맵형태로 데이터 저장 application.setAttribute("value", v); application.setAttribute("bu", bu); //어플리케이션에 저장된 값 읽어오기 int x = (Integer)application.getAttribute("value");
2. Session
Session은 클라이언트 별 임시저장공간이다.
Application은 서버단위로 데이터들 저장하고, request는 클라이언트 요청단위로 데이터를 저장하고,
Session은 클라이언트(웹브라우저별)단위로 데이터를 저장한다.
Session은 사용자를 다음과 같이 구별한다.
사용자를 구별하기 위해서 브라우저별로 세션아이디를 부여한다.
>첫 요청에는 세션아이디가 없다. 따라서 세션객체를 사용할 수 없다 (어플리케이션은 사용가능)
>첫 요청에 대한 응답에 따라 세션아이디가 자동으로 부여되고, 다음 요청부터 세션을 사용할 수 있게 된다.
(쿠키를 통해 세션아이디가 전달된다)
>브라우저를 닫거나, 세션이 만료되면, 기존의 세션아이디는 사라지고 새로운 아이디와 저장소를 부여받게 된다.
*동일 브라우저를 여러개 띄우는 것은 같은 클라이언트로 인식한다 (하나의 프로세스에 여러 쓰레드)
사용범위 - 세션(특정사용자)
생명주기 - 세션이 시작해서 종료될 때
저장위치 - WAS 서버의 메모리
//세션 생성하기 HttpSession session = request.getSession(); // session얻기 //맵형태로 데이터 저장 session.setAttribute("value", v); session.setAttribute("bu", bu); //세션에 저장된 값 읽어오기 String op =(String)session.getAttribute("bu");
세션은 값을 저장하고 꺼내는 것 외에도 위와 같은 옵션들이 있다.
위와 같은 옵션들로 세션에 저장된 데이터를 바로 해제하거나 세션의 생명주기를 관리할 수 있다.
3. Cookie
지금까지는 WAS내에 상태값을 저장했다.
Cookie는 반대로 상태값을 클라이언트가 가지고 다니는 것이다.
하나의 request에는 클라이언트 헤더정보, 사용자 데이터, 쿠키 총 3가지의 정보가 서버로 흘러들어온다.
헤더정보는 브라우저내에서 자동으로 설정된 것이고, 사용자는 데이터는 사용자가 설정해서 보낸 것이다.
나머지 하나인 쿠키는 Cookie는 서버가 미리 설정해서 때에 따라 꺼내서 쓸 수 있도록 브라우저에 저장해둔 값이다.
사용범위 - Web Browser 혹은 지정한 path 범주 공간 (특정 url에 한정 사용도 가능하다)
생명주기 - browser에 전달한 시간부터 만료시간까지
저장위치 - web Browser 메모리 혹은 파일
**서버 생명주기와 상관없이 저장 가능하다.
//쿠키 생성 및 response객체를 통해 쿠키 심기 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();
*쿠키의 출발점은 addCookie()로 일단 쿠키를 클라이언트 브라우저에 저장하는 것 부터 시작이다
*쿠키도 map형태로 값을 저장하는데, 문자열만 저장할 수 있다.!
4.1 Cookie의 path옵션
- 하나의 브라우저에 모든 페이지에 동일하게 쿠키를 저장하고 전달받으면, 쿠키를 찾아서 쓸 때 많은 불편함을 초래할 것이다.
> 특정 요청에서만 사용되는 데이터를 쿠키로 저장했을 때, 이를 사용하지 않는 요청은 이 쿠키를 읽을 필요없다.
> 브라우저별로만 쿠키가 운용된다면, 쿠키명이 중복되는 문제도 발생할 것이다.
이러한 불편함을 해소하기 위해 브라우저에 쿠키를 심되,
해당 쿠키를 필요로하는 요청 혹은 범주에서만 쿠키를 request에 담아서 가져오도록
path옵션을 설정할 수 있다.
Cookie valcookie = new Cookie("value",String.valueOf(v)); Cookie opcookie = new Cookie("bu",bu); valcookie.setPath("/"); opcookie.setPath("/"); // 이부분 response.addCookie(valcookie); response.addCookie(opcookie);
setPath는 쿠키를 보내기전에 간단하게 설정할 수 있다. 위는 모든 요청에 대해 쿠키를 가져오도록 설정해서 심어둔 것이
다
path를 /로 지정하면, 어떠한 요청에도 request에 쿠키를 담아오라는 뜻이 된다.
setPath를 변경하면, ex(/add)
동일 요청에 response헤더에는 쿠키가 path = /add로 심어지는 것을 확인할 수 있지만,
request시에는 쿠키가 같이 넘어가지 않아서 request헤더에 해당 쿠키를 찾아 볼 수 없다.
이때 /add로 요청하면
에러가 뜨지만, request헤더에 쿠키가 담겨져서 서버로 넘어간 것을 확인할 수 있다.
4.2 Cookie의 maxAge옵션
브라우저가 닫히면 쿠키는 어떻게 될까?
일반적으로는 Cookie의 생명주기는 브라우저와 같아서 브라우저 메모리내에 있다가
브라우저가 닫히면 사라지게된다.
하지만 maxAge옵션을 통해 브라우저와 상관없이 쿠키를 유지할 수 있다.
valcookie.setMaxAge(24*60*60); //하루 60초 60분 24시간)
다음과 같이 간단하게 maxAge를 설정할 수 있다.
이렇게 maxAge가 설정된 쿠키는 인터넷 브라우저 기준으로 아래와 같은 기본경로에 저장된다.
쿠키는 다른 저장공간과는 다르게 위와 같은 두가지 옵션에 이점이 있다.
따라서 특정 범위, 페이지에만 쓰는 데이터라던지, 저장기간이 아주 긴 데이터에 경우에는
쿠키를 사용하는 것이 좋다.
*쿠키와 비슷한 세션은 긴 시간 유지하기 어렵고, 브라우저 닫히면 쿠키를 통해 전달되는 session id가 초기화되서 오랜기간 유지되더라도 다시 접근할 수 없다.
참고자료:
뉴렉처 - jsp/Servlet강의 (유튜브)
https://www.youtube.com/@newlec1
'Web > Servlet-JSP' 카테고리의 다른 글
Servlet - JSP MVC03 - JSTL and EL (1) 2023.06.13 Servlet-JSP MVC03 (1) - forward and Redirect (0) 2023.06.13 Servlet-JSP MVC02(3) - 내장객체 (0) 2023.06.12 Servlet-JSP MVC02(2) - JSP와 Servlet의 관계 (0) 2023.06.12 Servlet-JSP MVC02(1) - 간단 JSP (0) 2023.06.12