본문 바로가기
lang/java web

[Boostcourse] DB 연결 웹 - 5. Scope

by Wordbe 2019. 11. 20.
728x90

Scope - BE

1. Scope란

Servlet, JSP 개발 시 변수를 많이 다룹니다.

변수의 사용범위를 다루는 스코프(scope)를 알아봅니다.

1) → 4) 순으로 큰 영역, 예를 들어 1)은 2,3,4를 포함

1) Application scope : 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우

2) Session scope : 웹 브라우저 별로 변수가 관리되는 경우 사용, 여러 개의 요청이 들어와도 유지

3) Request scope : client가 http 요청(request)한 후 WAS가 받아서 웹 브라우저에게 응답(response)할 때까지 변수가 유지되는 경우

4) Page scope : 페이지 내에서 지역변수처럼 사용 (각 servlet, jsp 파일)

2. Page Scope

특정 서블릿이나 JSP가 실행되는 동안에만 정보 유지할 경우 사용합니다.

  • PageContext 추상 클래스를 사용합니다.

  • JSP 페이지에서 pageContext 라는 내장 객체로 사용가능합니다.

  • forward가 될 경우 해당 page scope에 지정된 변수는 사용할 수 없습니다.

  • 사용방법은 나머지 scope에서와 같습니다.

  • 지역변수처럼 사용됩니다.

  • jsp에서 pageScope에 값을 저장한 후 해당 값을 EL, JSTL 표기법 등에서 사용할 때 사용합니다.

    이렇게 주로 사용합니다. (해당 페이지에서 변수를 선언하여 사용하는 방법과 비슷하기 때문에 servlet에서는 잘 안사용하게 됩니다.)

3. Request Scope

웹 브라우저로 WAS가 요청을 받은 후, 포워드가 진행되는 동안 유지하고 싶은 정보가 있을 경우 request scope을 사용합니다.

  • http요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지합니다.

  • 서블릿에서는 HttpServletRequest 객체 사용

  • JSP에서는 request 내장 변수를 사용

    값을 저장할 때는 request.setAtrribute()

    값을 읽어 들일 때는 request.getAttribute()

  • forward시 값을 유지하고자 할 때 사용합니다.

4. Session Scope

접속한 웹 브라우저(클라이언트)별로 세션을 열어 정보를 관리 하고 싶을 때 세선 스코프를 사용합니다.

  • 웹 브라우저 간의 탭간에는 세션정보가 공유되기 때문에, 각각의 탭에서는 같은 세션정보를 사용할 수 있습니다.

  • HttpSession 인터페이스를 구현한 객체를 사용합니다.

  • JSP에서는 session 내장 변수를 사용합니다.

    값 저장시 session.setAttribute()

    값 읽어들일 때는 session.getAttribute()

  • 서블릿에서는 HttpServletRequest의 getSession() 메소드를 이용하여 session 객체를 얻습니다.

  • 장바구니처럼 사용자별 정보가 유지되어야 할 때 사용합니다.

5. Application Scope

하나의 웹 어플리케이션에서 공유하고 싶은 변수가 있을 때 application scope를 사용합니다.

  • 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지됩니다.

    'firstWeb' 같은 프로젝트 하나하나가 application,

    'exam25', 'exam31' 등 하나의 서버에 여러개의 앱이 존재할 수 있습니다.

    여러 클라이언트는 동시에 어떤 서버의 한 어플리케이션에 접속할 수 있습니다.

  • ServletContext 인터페이스를 구현한 객체를 사용합니다.

  • jsp에서는 application 내장 객체를 이용합니다.

  • 서블릿에서는 getServletContext() 메소드를 이용해서 application 객체를 이용합니다.

  • 웹 어플리케이션 하나당 하나의 application 객체가 사용됩니다.

    값 저장시 application.setAttribute()

    값 읽어들일 때는 application.getAttribute()

  • 모든 클라이언트가 공통으로 사용해야할 값들이 있을 때 사용합니다.

실습

1) ApplicationScope01, ApplicationScope02 서블릿 2개 생성

2) applicationscope01.jsp 생성

3) ApplicationScope01 에 Application scope으로 value에 값 1을 저장

4) ApplicationScope02 에 Application scope으로 저장된 value에 1을 더하고 결과 출력

5) applicationscope01.jsp는 value 값에 2를 더한 후 결과 출력

  • Application scope은 웹 어플리케이션을 사용하는 모든 브라우저에서 같은 값을 사용합니다.

ApplicationScope01.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        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>");
    }

ApplicationScope02.java

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.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 += 2;
        application.setAttribute("value", value);
%>
    <h1><%=value %></h1>
<%
    }catch (NullPointerException ex){
%>
    <h1>설정한 값이 없습니다.</h1>
<%
    }
%>
</body>
</html>

Reference

https://www.edwith.org/boostcourse-web/lecture/16712/

728x90

댓글