Servlet-JSP

서블릿 스코프

voider 2020. 9. 11. 22:34

Servlet Scope!

서블릿 속성attribute 세 가지

  • ServletContext
  • HttpSession
  • HttpServletRequest

각 속성을 setAttribute()로 바인딩하고 getAttribute()로 꺼내서 쓴다.

서블릿 스코프scope란, 서블릿 속성에 접근할 수 있는 범위를 말한다.

servlet scope !

스코프 종류 해당 서블릿API 속성의 스코프
애플리케이션 스코프 ServletContext 속성은 애플리케이션 전체에서 접근할 수 있다.
세션 스코프 HttpSession 속성은 브라우저에서만 접근할 수 있다.
리퀘스트 스코프 HttpServletRequest 속성은 해당 요청-응답 사이클 안에서만 접근할 수 있다.

스코프의 기능

  • 로그인 상태 유지
  • 장바구니
  • MVC - Model과 View의 데이터 전달

예제

ServletContext, HttpSession, HttpServletRequest
각각 서블릿API의 스코프를 알아보는 예제다.

  1. 리퀘스트 스코프
  2. 세션 스코프
  3. 애플리케이션 스코프

SetAttribute.java

@WebServlet("/seta")
public class SetAttribute extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        String contextMsg = "context에 바인딩 됩니다.";
        String sessionMsg = "session에 바인딩 됩니다.";
        String requestMsg = "request에 바인딩 됩니다.";

        ServletContext ctx = getServletContext();
        HttpSession session = request.getSession();

        ctx.setAttribute("context", contextMsg);
        session.setAttribute("session", sessionMsg);
        request.setAttribute("request", requestMsg);

        out.print("binding.....");

        RequestDispatcher dis = request.getRequestDispatcher("/geta");
        dis.forward(request, response);
    }
}

GetAttribute.java

@WebServlet("/geta")
public class GetAttribute extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        ServletContext ctx = getServletContext();
        HttpSession session = request.getSession();

        String contextMsg = (String)ctx.getAttribute("context");
        String sessionMsg = (String)session.getAttribute("session");
        String requestMsg = (String)request.getAttribute("request");

        out.print("context : " + contextMsg + "<br>");
        out.print("session : " + sessionMsg + "<br>");
        out.print("request : " + requestMsg + "<br>");
    }
}

1. 리퀘스트 스코프의 경우

리퀘스트 스코프인 경우, 모든 서블릿API가 접근할 수 있다.

        RequestDispatcher dis = request.getRequestDispatcher("/geta");
        dis.forward(request, response);

Dispatcher를 이용하여 GetAttribute서블릿으로 이동하도록 포워드 했으므로,
GetAttribute서블릿이 request.setAttribute(..)로 보낸 정보를 getAttribute()로 꺼내볼 수 있다.

2.세션 스코프의 경우

위 코드를

        response.sendRedirect("/geta");

이렇게 바꾼다면, 과정은 이렇다.

  1. 브라우저가 '/seta'를 호출한다.
  2. SetAttribute.java는 해당 요청을 처리하고 브라우저에게 '/geta'를 재호출 하라는 응답을 보낸다.(sendRedirect)
  3. 브라우저는 응답에 따라 '/geta'를 재호출 한다.

브라우저 -> '/seta' -> 브라우저 -> '/geta'
바꿔 말하자면, ** 요청 -> 응답 -> 요청 -> 응답**이다. request스코프는 설명했다시피 요청 - 응답 한 사이클 안에서만 유효하다. 따라서 위처럼 반복하면, 바인딩된 값이 유실될 수밖에 없다.

3. 애플리케이션 스코프의 경우

위에서 코드는 그대로 유지한 채로, 다른 브라우저를 이용해서 '/geta'에 접속하면 이런 결과가 나타난다.

엣지 브라우저로 접속한 결과다.
SetAttribute.java에서 세션 객체에 바인딩한 값은 Chrome에 저장된다. 엣지 브라우저에서 크롬 세션에 접근할 수 없기 때문에 null을 반환한다. 반면 Context객체에 바인딩된 데이터는 파이어폭스나 사파리로 접속해도 같은 결과를 얻을 수 있다.

'Servlet-JSP' 카테고리의 다른 글

서블릿 리스너  (0) 2020.09.11
Servlet Filter  (0) 2020.09.11
세션 로그인 예제  (0) 2020.09.10
encodeURL()  (0) 2020.09.10
세션  (0) 2020.09.10