WebServer/JSP&Servlet

[Servlet] 서블릿 스코프 (Scope)

gangintheremark 2023. 8. 10. 16:30
728x90

Servlet에서 변수를 지정하고 객체에 담아 포워드하려면 객체가 어디까지 유지되는지 반드시 알아야한다. Servlet 스코프(scope)서블릿 속성에 접근할 수 있는 범위(Data 생성~소멸)를 의미하며 웹 어플리케이션에는 4개의 객체 범위가 존재한다. 

1. Page scope
2. Request scope
3. Session scope
4. Application scope

 

Request scope

  • 클라이언트로부터 하나의 요청이 들어와 서버가 처리한 후 응답을 보낼 때까지 사용 가능
  • HttpServletRequest 객체 사용
request.setAttribute(String key, Object value); // 저장
request.getAttribute(String key, Object value); // 조회
request.removeAttribute(String key, Object value); // 삭제

 

Session scope

  • 하나의 브라우저 당 1개의 session 객체 생성
  • 브라우저를 열고 요청한 후 브라우저가 종료될 때까지 사용 가능
    ➡️ 브라우저의 lifecycle과 일치
  • HttpSession 객체 사용
HttpSession session = request.getSession();
session.setAttribute(String key, Object value); // 저장
session.getAttribute(String key, Object value); // 조회
session.removeAttribute(String key, Object value); // 삭제

 

Application scope

  • 하나의 애플리케이션 당 1개의 application 객체 생성
  • 웹 애플리케이션이 생성된 후 종료될 때까지 사용 가능
  • ServletContext 객체 사용
ServletContext ctx = getServletContext();
ctx.setAttribute(String key, Object value); // 저장
ctx.getAttribute(String key, Object value); // 조회
ctx.removeAttribute(String key, Object value); // 삭제

 

테스트

setAttribute() 를 이용해 값을 저장

// SetServlet.java
package com.servlet;

@WebServlet("/SetServlet")
public class SetServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("SetServlet");

            // 1. request scope 에 값 저장
            request.setAttribute("request", "request scope");

            // 2. session scope 에 값 저장
            HttpSession session = request.getSession();
            session.setAttribute("session", "session scope");

            // 3. application scope 에 값 저장
            ServletContext ctx = getServletContext();
            ctx.setAttribute("application", "application scope");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

getAttribute()를 이용해 값 조회

package com.servlet;

@WebServlet("/GetServlet")
public class GetServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("GetServlet");

        // 1. request scope에 값 조회
        String x = (String) request.getAttribute("request");

        // 2. session scope에 값 조회
        HttpSession session = request.getSession();
        String x2 = (String)session.getAttribute("session");

        // 3. application scope에 값 조회
        ServletContext ctx = getServletContext();
        String x3 = (String)ctx.getAttribute("application");

        System.out.println("request: " + x);
        System.out.println("session: " + x2);
        System.out.println("application: " + x3);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);
    }

}

요청 및 응답 이후이기 때문에 request는 범위를 벗어나 null 값으로 출력된다.

 

 

※ scope의 범위는 page < request < session < application 순이다.

728x90