
[교재] Must Have 성낙현의 JSP 프로그래밍 책을 학습하며 정리한 글입니다.
내장 객체의 영역은 각 객체가 저장되는 메모리의 유효기간이라고 생각하면된다. JSP와 같은 웹 애플리케이션은 페이지 단위로 구성된다. 다른 페이지에서 선언한 변수를 또 다른 페이지에서도 접근할 수 있어야하기 때문에, 영역을 통해 내장 객체에 저장된 속성값을 공유할 수 있도록 한다.

데이터 전송 객체란 주로 데이터를 저장하거나 전송하는 데 쓰이는 객체로, 다른 로직 없이 순수하게 데이터만 담고있다. 데이터만 가지고 있는 객체라 하여 값 객체(Value Object, VO)라고 한다. DTO는 자바빈즈 규약에 따라 작성한다.
자바빈즈란 자바로 작성한 소프트웨어 컴포넌트로, 다음의 규약을 따르는 자바 클래스를 말한다.
DTO는 일반적인 자바 클래스이다. src/main/java에 생성해야한다.
page 영역은 기본적으로 클라이언트의 요청을 처리하는 데 관여하는 JSP 페이지마다 하나씩 생성된다. 그리고 이때 JSP 페이지는 page 영역을 사용하기 위한 pageContext 객체를 할당받게 된다. 이 객체에 저장된 정보는 해당 페이지에서만 사용할 수 있고 페이지를 벗어나면 소멸된다. 한편, include 지시어로 포함한 파일은 하나의 페이지로 통합되므로 page 영역이 공유된다.
클라이언트가 요청을 할 때마다 새로운 request 객체가 생성되고, 같은 요청을 처리하는데 사용되는 모든 JSP페이지가 공유한다. 따라서 request 영역에 저장된 정보는 현재 페이지와 포워드된 페이지까지 공유할 수 있다. 단, 페이지 이동 시에는 소멸되어 사용할 수 없게 된다. 이처럼 request 영역은 하나의 요청에 대한 응답이 완료될 때 소멸하게 되므로 page 영역보다는 접근 범위가 조금 더 넓다.
클라이언트가 웹 브라우저를 최초로 열고난 후 닫을 때까지 요청되는 모든 페이지는 session 객체를 공유할 수 있다. 세션이란 클라이언트가 서버에 접속해 있는 상태 혹은 단위를 말하는 것으로, 주로 회원인증 후 로그인 상태를 유지한느 처리에 사용된다.
웹 애플리케이션은 단 하나의 application 객체만 생성하고, 클라이언트가 요청하는 모든 페이지가 application 객체를 공유하게 된다. 또한 application 객체는 웹 서버를 시작할 때 만들어지며, 웹 서버를 내릴 때 삭제된다. 따라서 application 영역에 한 번 저장된 정보는 페이지를 이동하거나, 웹 브라우저를 닫았다가 새롭게 접속해도 삭제되지 않는다.

쿠키는 클라이언트의 상태 정보를 유지하기 위한 기술이다. 상태 정보를 클라이언트(주로 웹 브라우저)에 키와 값 형태로 저장했다가 다음 요청 시 저장된 쿠리를 함께 전송한다. 그러면 웹 서버는 브라우저가 전송한 쿠키로부터 필요한 데이터를 읽어올 수 있다. 쿠키 표준에는 다음과 같이 제약이 있다고 명시되어있다.
따라서 쿠키로 저장할 수 있는 최대 용량은 대략 1.2MB이다. 하지만 모든 브라우저가 표준을 그대로 따르지 않으며, 대부분 이보다 적은 수만 지원한다.

setName()이 없는 이유는 쿠키의 이름은 생성자를 통해 설정하고, 생성 후에는 더 이상 이름을 변경할 수 없기 때문이다.
쿠키는 생성 직후에는 사용할 수 없다. 쿠키는 서버에서 먼저 생성한 후 응답 헤더를 통해 클라이언트로 전송한다. 이때 서버는 클라이언트의 요청에 의해 단지 쿠키를 만들기만 할 뿐 그 내요을 즉시 읽지 않는다. 클라이언트로부터 재요청이 들어올 때 요청 헤더를 통해 쿠키가 서버로 전송되는데 이때부터 내용을 읽을 수 있다.
쿠키를 읽을 때 생성한 적 없는 JSESSIOND라는 쿠키도 생성되는데 이 쿠키는 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키로, 새로운 웹브라우저를 열면 자동으로 생성된다.

쿠키를 통해 구현할 수 있다. -> 쿠키를 통해 하루동안 열지 않음 체크박스를 통해 유지할 수 있다.


JSP에 자바스크립트를 추가하여 할 수 있다,.


import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieManager {
// 명시한 이름, 값, 유지 기간 조건으로 새로운 쿠키를 생성합니다.
public static void makeCookie(HttpServletResponse response, String cName,
String cValue, int cTime) {
Cookie cookie = new Cookie(cName, cValue); // 쿠키 생성
cookie.setPath("/"); // 경로 설정
cookie.setMaxAge(cTime); // 유지 기간 설정
response.addCookie(cookie); // 응답 객체에 추가
}
// 명시한 이름의 쿠키를 찾아 그 값을 반환합니다.
public static String readCookie(HttpServletRequest request, String cName) {
String cookieValue = ""; // 반환 값
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
String cookieName = c.getName();
if (cookieName.equals(cName)) {
cookieValue = c.getValue(); // 반환 값 갱신
}
}
}
return cookieValue;
}
// 명시한 이름의 쿠키를 삭제합니다.
public static void deleteCookie(HttpServletResponse response, String cName) {
makeCookie(response, cName, "", 0);
}
}