서블릿 스코프

코코·2020년 8월 9일
0

Servlet/JSP

목록 보기
13/20

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객체에 바인딩된 데이터는 파이어폭스나 사파리로 접속해도 같은 결과를 얻을 수 있다.

1개의 댓글

comment-user-thumbnail
2021년 1월 15일

어플리케이션 스코프 같은 경우는 다른 디바이스로 접속해도 같은 결과가 나올까요?

답글 달기