-
[Back End] ScopeWeb Development/부스트코스 - Back-End(Java) 2020. 3. 7. 16:12
Scope
- Servlet과 JSP를 개발하다보면 변수를 많이 다루게 된다.
- 어떤 변수는 웹 어플리케이션에서 공유하고싶고, 어떤 변수는 사용자 별로 유지하고, 또 어떤 변수는 포워딩 되는 동안 유지하고 싶은 변수가 있다.
- 이렇게 변수를 어떤 범위 내에서 사용하기 위해서는 Scope(스코프)라는 것에 대해 알아야한다.
4가지 Scope
- Application : 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용한다.
- Session : 웹 브라우저 별로 변수가 관리되는 경우 사용한다.
- Request : http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수가 유지되는 경우 사용한다.
- Page : 페이지 내에서 지역변수처럼 사용한다.
Page Scope
- PageContext 추상 클래스를 사용한다.
- JSP 페이지에서 pageContext라는 내장 객체로 사용 가능하다.
- 어떤 페이지가 요청을 받으면, PageContext가 하나씩 생성된다. 페이지 이용이 끝나면 PageContext는 소멸된다.
- forward가 될 경우 해당 Page scope에 지정된 변수는 사용할 수 없다.
- 사용 방법은 Application scope, Session scope, Request scope와 같다.
- 마치 지역변수처럼 사용된다는 것이 다른 scope들과 다르다.
- JSP에서 Page Scope에 값을 저장한 후 해당 값을 EL 표기법 등에서 사용할 때 사용된다.
- 지역 병수처럼 해당 JSP 또는 서블릿이 실행되는 동안에만 정보를 유지하고 할 때 사용된다.
Request Scope
- HTTP 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용한다.
- 서버는 요청을 받으면, 그 요청에 대한 response 객체와 request 객체를 생성한다.
- 서버는 요청에 대한 응답을 한 후, response 객체와 request 객체는 소멸된다.
- 서블릿에서는 HttpServletRequest 객체를 사용한다.
- JSP에서는 request 내장 객체를 사용한다.
- request.setAttribute(), request.getAttribute() 메소드를 사용하여 변수를 저장하고 불러온다.
- foward를 하기전에, request 객체의 setAttribute() 메소드를 통해 값을 저장한후 서블릿이나 JSP에게 forward를 하는데, 이렇게 forward 되는 동안 값이 유지되는 이유는 Request Scope를 사용했기 때문이다.
Session Scope
- 클라이언트(브라우저)마다 변수를 관리하고자 할 경우 사용한다.
- 서버는 클라이언트마다 하나의 새션 객체를 만들어 클라이언트 상태정보를 관리한다.
- 장바구니처럼 사용자별로 유지가 되어야 할 정보가 있을 때 사용한다.
- 웹 브라우저의 탭 간에는 세션정보가 공유되기 때문에, 각각의 탭에서는 같은 세션정보를 사용할 수 있다.
- 클라이언트 요청에 대한 응답이 끝난후 esponse, request 객체는 소멸되지만 session 객체는 소멸되지 않는다.
session 객체는 정해진 시간이 지나거나, 클라이언트의 브라우저가 바뀌면 소멸된다.
- 서블릿에서는 HttpServletRquest의 getSession 메소드를 사용하여 session 객체를 얻는다.
- JSP에서는 session 내장 객체를 사용한다.
- session.setAttribute(), session.getAttribute() 메소드를 사용하여 변수를 저장하고 불러온다.
Application Scope
- 웹 어플리케이션이 시작되고 종료될 때까지 변수를 사용할 수 있다.
- 웹 어플리케이션이 시작되면 하나의 application 객체가 생성된다. 웹 서버가 종료되면 application 객체는 소멸된다.
- 하나의 서버에는 웹 어플리케이션이 여러개 존재 할 수 있다. 웹 애플리케이션 하나 당 application 객체는 하나씩 존재한다.
- 서블릿에서는 getServletContext() 메소드를 사용하여 application 객체를 얻는다.
- JSP에서 application 내장 객체를 사용한다.
- application.setAttribute(), application.getAttribute() 메소드를 사용하여 변수를 저장하고 불러온다.
Application Scope 예제
- Application Scope를 예제를 통해 알아보자
- ApplicationScope01.java 는 Application Socpe에 있는 변수 value를 1로 초기화 한다.- ApplicationScope02.java 는 Application Socpe에 있는 변수 value에 1을 더한다.
- applicationscope01.jsp 는 Application Socpe에 있는 변수 value에 2를 더한다.
ApplicationScope01.java
package examples; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ApplicationScope01") public class ApplicationScope01 extends HttpServlet { private static final long serialVersionUID = 1L; public ApplicationScope01() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); ServletContext application = getServletContext(); //application 객체를 얻어온다. int value = 1; application.setAttribute("value", value); //1로 초기화한 value 변수를 application 객체에 넘겨준다. out.println("<h1>value : " + value + "</h1>"); } }
ApplicationScope02.java
package examples; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ApplicationScope02") public class ApplicationScope02 extends HttpServlet { private static final long serialVersionUID = 1L; public ApplicationScope02() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); ServletContext application = getServletContext(); //application01 서블릿이 실행되지 않았다면, null 값이 넘어온다. 따라서 예외처리를 해줘야함 try { int value = (int)application.getAttribute("value"); value++; application.setAttribute("value", value); out.println("<h1>value : " + value + "</h1>"); }catch(NullPointerException ex) { out.println("value가 설정되지 않습니다."); } } }
Applicationscope01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% try{ int value = (int)application.getAttribute("value"); //내장 객체사용 value = value + 2; application.setAttribute("value", value); %> <h1><%=value %></h1> <% }catch(NullPointerException ex){ %> <h1>설정된 값이 없습니다.</h1> <% } %> </body> </html>
'Web Development > 부스트코스 - Back-End(Java)' 카테고리의 다른 글
[Back End] JDBC - 실습 (0) 2020.03.14 [Back End] JDBC (0) 2020.03.14 [Back End] JSTL, EL, Maven (0) 2020.03.09 [Back End] Redirect & Forward (0) 2020.03.06 [Back End] JSP 기초 (0) 2020.03.05