Scope란?
변수를 어떤 범위 내에서 사용하기 위해 알아야할 것이다.
Scope에는 4가지 종류가 있다.
application : 웹 어플리케이션이 종료될 때까지
session : 웹 브라우저 별로 변수가 관리되는 경우
request : http 요청을 WAS 가 받아서 웹 브라우저에게 응답할 때까지 변수가 유지되는 경우
page : 페이지 내에서 지역변수처럼 사용
1. Page Scope
특정 서블릿이나 JSP가 실행되는 동안에만 정보를 유지하고 싶은 경우 사용하는 scope이다.
- PageContext라는 추상 클래스를 이용한다.
- JSP 페이지에서는 pageContext라는 내장 객체로 사용 가능하다.
- forward가 될 경우 해당 Page Scope에 지정된 변수는 사용할 수 없다. (당연하다. 그 페이지 내에서만 적용되기 때문이다.)
- 지역변수처럼 사용된다는 것이 다른 scope들과 다르다.
- jsp 에서 pageScope 에 값을 저장한 후 해당 값을 EL 표기법 등에서 사용할 때 사용된다.
EL 표기법이란?
아래와 같이 변수를 ${} 이렇게 사용하는 것을 말한다.
<h1>EL 표기법으로 출력합니다.</h1>
<p>${v1} + ${v2} = ${result}</p>
2. Request Scope
웹 브라우저로부터 WAS가 요청을 받은 후, forward 되는 동안 유지하고 싶은 정보가 있을 경우 사용하는 scope이다.
- http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용한다.
- HttpServletRequest 객체 사용한다.
- JSP 페이지에서는 request 내장 변수를 사용한다.
- 값을 저장할 때는 request 객체의 setAttribute()를 불러올 때는 getAttribute() 를 사용한다.
(forward 실습을 할 때 사용한 방법이 이 방법이다.)
리다이렉트 될 경우 request scope를 이용하면 정보를 유지할 수 있을까?
불가하다. 왜냐하면 리다이렉트는 요청에 대한 응답을 보낸 후, 새 창에서 새로운 요청을 받아 응답을 처리하므로 다른 HttpServletRequest 객체가 생성된다.
3. Session Scope
접속한 웹 브라우저 별로 정보를 관리하고 싶을 때 사용하는 scope이다.
- 웹 브라우저 별로 변수를 관리하고자 할 경우 사용한다.
- 각각의 탭에서는 같은 세션 정보를 사용할 수 있다.
- HttpSession 인터페이스를 구현한 객체를 사용한다.
- JSP 페이지 에서는 session 내장 변수를 이용한다.
- 서블릿에서는 HttpServletRequest의 getSession() 메서드를 이용하여 session 객체를 얻는다.
session scope는 어떤 경우에 이용하는 것이 좋을까?
장바구니와 같이 사용자 별로 페이지가 유지되어야하는 경우, 로그인과 같이 브라우저가 종료되기 전까지 상태 정보를 유지해야하는 경우
4. Application Scope
하나의 웹 어플리케이션에서 공유하고 싶은 변수가 있을 때 사용하는 scope이다.
- 웹 어플리케이션이 시작되고 종료될 때까지 변수를 사용할 수 있다.
- ServletContext 인터페이스를 구현한 객체를 사용한다.
- JSP 페이지에서는 application 내장 객체를 이용한다.
- 서블릿의 겨우 getServletContext(). 메서드를 이용하여 application 객체를 이용한다.
- 모든 클라이언트가 공통으로 사용해야할 값이 있을 때 사용한다.
applicationscope에 대한 실습이다.
ApplicationScope01.java에서는 Application scope로 "value"에 1값을 저장한다.
ApplicationScope02.java에서는 "value" 값에 1을 더한 후 출력한다.
applicationscope01.jsp 에서는 "value" 값에 2를 더한 후 결과를 출력한다.
applicationscope01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>application-scope</title>
</head>
<body>
<%
try {
int value = (int) application.getAttribute("value");
value = value + 2;
application.setAttribute("value", value);
%>
<h1><%=value%></h1>
<%
} catch(NullPointerException e) {
%>
<h1>설정된 값이 없습니다.</h1>
<%
}
%>
</body>
</html>
ApplicationScope01.java
@WebServlet("/ApplicationScope01")
public class ApplicationScope01 extends HttpServlet {
public ApplicationScope01() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
ServletContext application = getServletContext();
int value = 1;
application.setAttribute("value", value);
writer.print("<h1>value : " + value + "</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
ApplicationScope02.java
@WebServlet("/ApplicationScope02")
public class ApplicationScope02 extends HttpServlet {
public ApplicationScope02() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
ServletContext application = getServletContext();
try {
int value = (int) application.getAttribute("value");
value++;
application.setAttribute("value", value);
writer.print("<h1>value : " + value + "</h1>");
} catch(NullPointerException e) {
writer.print("value 가 설정되지 않았습니다");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
이 글은 부스트코스 풀스택 강의를 보고 정리했습니다.
https://www.boostcourse.org/web316/joinLectures/12943
웹 프로그래밍(풀스택)
부스트코스 무료 강의
www.boostcourse.org
'🌐web' 카테고리의 다른 글
[Servlet/Jsp] EL 표현 언어 사용법 (0) | 2023.03.14 |
---|