[Web] Scope

웹 프로그래밍을 하다보면 변수가 어디서부터 어디까지 범위를 가지는지 유의해야한다.
총 네가지의 Scope이 있다.


  • Page : 선언된 한 페이지 내부에서만 사용 가능
  • Request : 클라이언트로부터 요청이 들어와서 서버가 그 요청을 수행 완료할 때까지 사용
  • Session : Session객체가 생성되고 소멸될 때까지 사용 (즉 요청이 하나가 아닌 여러개가 들어와도 하나로 유지되는 scope)
  • Application : 하나의 어플리케이션이 생성되어 소멸될 때까지 계속 유지되는 scope

  • Page Scope
PageContext 추상 클래스를 사용한다. JSP 페이지에서 pageContext라는 내장 객체로 사용 가능하다. forward될 경우 해당 page scope에 지정된 변수를 사용 할 수 없다. 마치 지역변수처럼 사용된다는 점이 다른 스코프들과 다른 점이다. jsp에서 pageScope에 값을 저장 한 후 해당 값을 EL 표기법에서 사용 할 때 사용된다. 지역 변수처럼 해당 JSP나 서블릿이 실행되는 동안에만 정보를 유지하고자 할 때 사용된다. 
  • Request Scope
http 요청을 WAS가 받아서 웹 브라우저에 응답할 때까지 변수값을 유지하고자 할 경우 사용한다. HttpServletRequest객체를 사용하고 JSP 에서는 request 내장 변수를 사용한다. 값을 저장할 때는 request객체의 setAttribute() 메소드, 값을 읽어 들일 때는 request 객체의 getAttribute()메소드를 사용한다. forward시 값을 유지하고자 할때 사용한다. 
  • Session Scope
웹 브라우저 별로 변수를 관리하고자 할 경우 사용한다 .웹브라우저간 탭 간에는 세션정보가 공유되기 때문에 각각의 탭에서는 같은 세션정보를 사용할 수 있다. 즉 브라우저를 닫거나 지정된 시간이 지나면 객체가 사라지는 식으로 작동한다. HttpSession 인터페이스는 구현한 객체를 사용하며 JSP에서는 session 내장 변수를 사용한다. 사용예로는 장바구니처럼 사용자별로 유지가 되어야 할 정보가 있을 때가 되겠다.
  • Application Scope
서버에는 web application이 여러개 올라갈 수 있다. web application이란 간단한 예를 들면 이클립스에서 작업하고있는 하나의 프로젝트 이다. Application scope은 어플리케이션이 시작되면 각 어플리케이션당 객체가 하나씩 만들어져서 어플리케이션이 종료될 때까지 저장되는 정보이다. ServletContext 인터페이스를 구현한 객체를 사용하고 jsp에서는 application 내장 객체를 이용한다. 모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 사용한다.  

예제 : Application scope 실습
firstweb이라는 큰 프로젝트 아래에 AS01, AS02 두개의 서블릿과 AS01.jsp를 생성한다. AS01 서블릿에 Application Scope로 value에 값을 저장한다. 서블릿 AS02에서 value에 1을 저장한다. AS01.jsp 에서 value에 2를 더한 후 그 결과를 출력한다. 배운 내용을 총합하면 어플리케이션 스코프로 사용되는 변수는 모든 서블릿과 jsp 에서 공동으로 사용해야한다.

[ApplicationScope01.java]
1
2
3
4
5
6
7
8
9
10
11
12
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/html; charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        
        ServletContext application = getServletContext();
        int value = 1;
        application.setAttribute("value", value);
        
        out.println("<h1>value : "+value+"</h1>");
    }
cs

[ApplicationScope02.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        
        ServletContext application = getServletContext();
        try {
        int value = (int)application.getAttribute("value");
        value++;
        application.setAttribute("value", value);
        
        out.println("<h1>value : "+value+"</h1>");
        }catch (NullPointerException e) {
            out.print("value의 값이 설정되지 않았습니다");
        }
    }
cs

[applicationScope01.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
<%
    try{
    int value = (int)application.getAttribute("value");
    value = value+2;
    application.setAttribute("value", value);
%>
    <h1>Value : <%=value %></h1>
<%
    }catch (NullPointerException e){
%>
        <h1>설정된 값이 없습니다.</h1>
<%    }
%>
cs


ApplicationScope02.java와 applicationScope01.jsp에서는 AS01.java에서 설정한 값을 사용하기 때문에 해당 서블릿보다 먼저 실행되면 값이 없어서 오류가 발생할 수 있으므로 Error Handling을 해준다. 

No comments:

Powered by Blogger.