웹은 원래 상태를 저장하게끔 만들어지지 않았다. 초창기 웹은 항상 정해져있는 정적데이터만 사용가능했지만, 현재는 상태라는 정보를 넣음으로써, 값을 저장하며 그 값이 언제까지 유지되는지 알 수 있게 되었다.
예를 들어, 사용자가 회원가입을 할 때 본인인증 ➡️ 가입 ➡️ 로그인 순으로 이루어진다.
이러한 일들은 순서가 있으며 본인인증을 먼저 거쳐야지 가입을 할 수 있다.
우리는 본인인증에서 변수를 만들어서 testOk = true
값을 가지면 가입이 되기로 만들었다. 하지만, 어떠한 변수를 만들어 놨을 때 testOk
를 만들어 놨으면 가입까지는 가져가야 된다. 하지만 어디에 저장할까?
파일에 저장? 아니다. 매번 휘발성 데이터를 파일에 저장할 필요가 없다. 파일은 영속성을 가지기 때문에 파일에 저장하지 않는다.
서버는 이 정보(데이터)를 언제까지 유지해야 되는가에 대한 상태를 4가지의 영역으로 나눴다.
❗️ 하나의 요청을 처리하는데 두 개 이상의 JSP가 사용될 수도 있다.
이는, request 기본 객체를 공유하게 된다.
- 웹 브라우저가 호출한 JSP 페이지가 다른 JSP를
include
- 웹 브라우저가 호출한 JSP 페이지가 다른 JSP를
forward
✔️ Attribute <속성의 이름, 값>
: JSP 페이지 사이에서 정보를 주고받거나 공유하기 위한 목적으로 사용됨
✔️ 4개의 기본 객체는 속성(Attribute)을 갖는다.
setAttribute(String name, Object value)
: void
: 이름이 name인 속성의 값을 value로 지정한다.
getAttribute(String name)
: Object
: 이름이 name인 속성의 값을 구한다.
: 지정한 이름의 속성이 존재하지 않으면 null을 리턴한다.
removeAttribute(String name)
: void
: 이름이 name인 속성을 삭제한다.
getAttributeNames()
: Enumeration<String>
: 속성의 이름 목록을 구한다,
: pageContext 기본 객체는 이 메서드를 제공하지 않는다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// application 기본 객체에 설정할 속성 이름으로 사용할 파라미터를 읽어온다.
String name = request.getParameter("name");
// application 기본 객체에 설정할 속성값으로 파라미터를 읽어온다.
String value = request.getParameter("value");
if(name != null && value != null) {
// application 기본 객체에 속성 설정
// 파라미터로 전달받은 값을 속성 이름과 값으로 사용한다.
application.setAttribute(name, value);
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>속성 지정</title>
</head>
<body>
<%
if(name != null && value != null) {
%>
application 기본 객체의 속성 설정:
<%= name %> = <%= value %>
<%
} else {
%>
application 기본 객체의 속성 설정 안함
<%
}
%>
</body>
</html>
http://localhost:8080/04_25/setApplicationAttribute.jsp?name=속성이름&value=속성값
setApplicationAttribute.jsp를 또 실행하여 http://localhost:8080/04_25/setApplicationAttribute.jsp?name=attr&value=value1
을 추가하고 application 기본 객체의 속성 출력 결과를 확인해보자.
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>기본 객체 속성 보기</title>
</head>
<body>
<%
Enumeration<String> attrEnum = application.getAttributeNames();
while(attrEnum.hasMoreElements()) {
String name = attrEnum.nextElement();
Object value = application.getAttribute(name);
%>
application 속성: <b><%= name %></b> = <%= value %><br>
<%
}
%>
</body>
</html>
처음 setApplicationAttribute.jsp에서 설정한 application 속성과 두 번째로 설정한 application 속성이 다 나오는 것을 확인 할 수 있다.
서로 다른 JSP 페이지와 서로 다른 웹 브라우저에서 동일한 application 기본 객체의 속성을 사용하는 이유는 웹 어플리케이션 내에 있는 모든 JSP가 한 개의 application 기본 객체를 공유하기 때문이다.
❗️ setApplicatonAttribute.jsp로 지정한 속성 이외에 다른 속성들이 표시되는 것은?
- 톰캣 서버가 제공하는 것으로 톰캣에서만 유효한 것
- 유지보수 과정에서 톰캣 서버를 JBoss와 같은 서버로 교체하면 톰캣 관련 속성들을 사용할 수 없다.
➡️ 특정 컨테이너에서만 제공하는 속성은 사용하지 않는 것이 좋다.
📎 setAttribute(String name, Object value)
속성의 이름은 문자열을 나타내는 String
타입이지만, 값은 모든 클래스 타입이 올 수 있다.
session.setAttribute("date", new java.util.Date());
session.setAttribute("memberId", "jipark09");
application.setAttribute("application_temp", new File("c:\\temp"));
Date date = (Date)session.getAttribute("date");
String memberId = (String)session.getAttribute("memberId");
File tempDir = (File)application.getAttribute("application_temp");
리턴값이 Object이기 때문에 형변환 해줘야 한다.
✔️ 기본 데이터 타입의 값은 래퍼 타입을 대신 사용해야 한다.
int
➡️ Integer
// int의 래퍼 타입인 Integer를 이용해서 값을 설정
request.setAttribute("age", new Integer(20));
// = request.setAttribute("age", 20);
// int age = (Integer)request.getAttribute("age");
Integer ageAttr = (Integer)request.getAttribute("age");
int ageValue = ageAttr.intValue();
java는 기본적으로 래퍼 타입 간의 변환을 자동으로 처리해주는 오토 박싱 / 오토 언박싱 기능을 제공하므로 new Integer(20)
으로 지정해주지 않고 20
을 넣어도 자동으로 오토 박싱이 된다.
또한 Integer 타입의 값도 자동으로 int타입으로 변환된다.
Servlet 초기화 파라미터를 지정할 때 DD파일에 context-Param 태그를 사용한다.
context-Param은 서버와 상관없이 영속성을 보장한다.
하지만 Attribute는 값을 담아둘 수 있지만 서버를 껐다가 키면 값이 사라진다.
MVC(Model, View,Controller)는 각각 기능이 다르다.
결론적으로 결과를 만들어낸다는 것은 3가지 파트가 다 합쳐진 것이다.
즉, 각각 할일이 끝내야 되는데 끝난다는 말은 3개의 분리된 영역에서 완전히 단절된 것이 아니고 서로서로 전달되는 값이 존재한다는 의미이다. 이 값을 request의 Attribute를 이용한다.
그래서 위와 같은 일이 끝나면 전달되는 값이 사라지고, 그러한 일 처리가 request가 적합하다.