ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Back End] Scope
    Web Development/부스트코스 - Back-End(Java) 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>

    '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

    댓글

Designed by Tistory.