1. 객체 범위 종류
웹 애플리케이션에는 4개의 객체 범위가 존재합니다.
- page 영역
- request 영역
- session 영역
- application 영역
이로 미루어 보아 scope 범위는 page < request < session < application 순이라는 것을 알 수 있습니다.
2. 테스트
4개의 scope 개념에 대해 알았으니, 이제 어떻게 활용하는지 알아보도록 하겠습니다.
ScopeServlet.java
@WebServlet("/scope")
public class ScopeSerlvet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// page는 JSP파일에서 작성 ( JSP only )
// request
request.setAttribute("num2", 20);
// session
request.getSession().setAttribute("num3", 30);
// application
request.getServletContext().setAttribute("num4", 40);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/index.jsp");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
각 영역에 객체를 할당하는 방법은 위와 같습니다.
page 영역은 JSP 내에서만 존재하므로 Servlet에서 만들 수 없습니다.
이제 JSP 파일을 만들어서 각 영역의 값을 확인해보겠습니다.
/WEB-INF/index.jsp
<%
pageContext.setAttribute("num1", 10);
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${ pageScope.num1 } <br>
${ requestScope.num2 } <br>
${ sessionScope.num3 } <br>
${ applicationScope.num4 } <br>
<hr>
${ num1 } <br>
${ num2 } <br>
${ num3 } <br>
${ num4 } <br>
</body>
</html>
Scope를 출력하는 방법은 위와 같습니다.
- 지금까지 java 코드 값을 출력하는 방식으로 <%= %>을 사용했었는데, 지금은 ${ }을 사용했습니다.
- ${ }은 표현식으로서, 다음 글에서 자세히 다룹니다. 지금은 각 Scope의 값을 출력하는 방법에 주목해주세요.
첫 번째 방법은 Scope 영역을 명시하고 출력하고자 하는 애트리뷰트 명을 작성했고,
두 번째 방법은 바로 애트리뷰트 명을 작성했습니다.
결과를 보면 다음과 같습니다.
두 방법 모두 같은 결과를 얻습니다.
즉, 애트리뷰트 명을 잘 작성했다면 두 번째 방법으로 사용하는 것이 간단하므로 좋을 것입니다.
그런데 서로 다른 영역에 같은 이름을 갖는 애트리뷰트가 있다면 어떤 영역의 애트리뷰트가 선택될까요?
스코프 범위에 따라, 애트리뷰트 명은 좁은 범위의 영역부터 큰 범위의 영역으로 탐색을 합니다.
즉, page -> request -> session -> application 순으로 탐색을 하며, 탐색이 된다면 더 이상 큰 범위로 탐색을 진행하지 않습니다.