[Web] 서블릿 속성과 스코프

2024. 8. 21. 06:49자바 웹 개발/세션 쿠키 필터 리스너

서블릿 속성은 ServletContext, HttpSession, HttpServletRequest 세 가지 서블릿 API 클래스에 저장되는 객체(정보)이다. 서블릿의 스코프는 서블릿 API에 바인딩된 속성에 대한 접근 범위를 의미한다. 

스코프 종류 해당 서블릿 API 속성 스코프
애플리케이션 스코프 ServletContext 애플리케이션 전체에 접근
세션 스코프 HttpServlet 브라우저에만 접근
리퀘스트 스코프 HttpServletRequest 해당 요청/응답 사이클에서만 접근

 

예제를 통해 이를 확인해볼 수 있다. 

 

setAttribute 메서드를 이용해서 각 속성을 바인딩하였다. 

@WebServlet("/set")
public class SetAttribute extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		String ctxMesg = "context에 바인딩됩니다.";
		String sesMesg = "session에 바인딩됩니다.";
		String reqMesg = "request에 바인딩됩니다.";
		
		ServletContext ctx = getServletContext();
		HttpSession session = req.getSession();
		ctx.setAttribute("context", ctxMesg);
		session.setAttribute("session", sesMesg);
		req.setAttribute("request", reqMesg);
		out.print("바인딩을 수행합니다.");
	}
	
}

 

getAttribute 메서드를 이용해 속성 이름으로 바인딩한 값을 가져와 브라우저로 출력한다. 

@WebServlet("/get")
public class GetAttribute extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		ServletContext ctx = getServletContext();
		HttpSession sess = req.getSession();
		
		String ctxMesg = (String) ctx.getAttribute("context");
		String sesMesg = (String) sess.getAttribute("session");
		String reqMesg = (String) req.getAttribute("request");
		
		out.print("context값:" + ctxMesg + "<br>");
		out.print("session값:" + sesMesg + "<br>");
		out.print("request값:" + reqMesg + "<br>");
	}
	
}

 

Context와 Session 객체에 바인딩된 속성은 같은 브라우저에서 접근할 수 있으므로 값을 출력한다. 그러나 기존에 바인딩된 request 객체를 /get으로 요청하여 생성된 request 객체와 다르므로 null이 출력된다. 

Edge로 접근해서 get요청을 하면 크롬 세션 객체에 접근할 수 없어 null이 출력된다. 반면에 Context는 바인딩된 데이터를 모든 브라우저에서 접근할 수 있어서 같은 결과가 출력된다.