jujube bat 2020. 3. 7. 16:12

Scope

- Servlet과 JSP를 개발하다보면 변수를 많이 다루게 된다. 

- 어떤 변수는 웹 어플리케이션에서 공유하고싶고, 어떤 변수는 사용자 별로 유지하고, 또 어떤 변수는 포워딩 되는 동안 유지하고 싶은 변수가 있다.

- 이렇게 변수를 어떤 범위 내에서 사용하기 위해서는 Scope(스코프)라는 것에 대해 알아야한다.

 

4가지 Scope

- Application : 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용한다.

- Session : 웹 브라우저 별로 변수가 관리되는 경우 사용한다.

- Request : http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수가 유지되는 경우 사용한다.

- Page : 페이지 내에서 지역변수처럼 사용한다.

 

4가지 스코프

 

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>