웹 개발 기초/자바 웹을 다루는 기술

서블릿 속성과 스코프

sungw00 2023. 2. 22. 18:03
728x90

서블릿 속성

서블릿 속성이란 다음 세 가지 서블릿 API 클래스에 저장되는 객체(정보)이다.

  • ServletContext
  • HttpSession
  • HttpServletRequest

서블릿 API의 setAttribute(String name, Object value)로 바인딩하고, 필요할 때 getAttribute(String name)으로 바인딩 된 속성을 가져오면 된다. 또한 removeAttribute(String name)을 이용해 속성을 서블릿 API에서 제거할 수도 있다.


서블릿의 스코프

서블릿 API에 바인딩 된 속성에 대한 접근 범위를 의미한다.

  • ServletContext에 바인딩 된 속성은 애플리케이션 전체에서 접근할 수 있으므로 애플리케이션 스코프를 가짐
  • HttpSession에 바인딩 된 속성은 그 HttpSession에 해당하는 브라우저에서만 접근할 수 있으므로 세션 스코프를 가짐
  • HttpServletRequest는 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 가짐

 

스코프의 기능

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

 

스코프의 종류와 특징

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

각 서블릿 API에 바인딩 된 속성의 스코프 알아보기

// SetAttribute.java
package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SetAttribute
 */
@WebServlet("/set")
public class SetAttribute extends HttpServlet {
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		String ctxMesg = "context에 바인딩됩니다.";
		String sesMesg = "session에 바인딩됩니다.";
		String reqMesg = "request에 바인딩됩니다.";
		// HttpServletContext 객체, HttpSession 객체, HttpServletRequest 객체를 얻은 후 속성을 바인딩 함
		ServletContext ctx = getServletContext();
		HttpSession session = request.getSession();
		ctx.setAttribute("context", ctxMesg);
		session.setAttribute("session", sesMesg);
		request.setAttribute("request", reqMesg);
		out.print("바인딩을 수행합니다.");
	}

}

ServletContext, HttpSession, HttpServletRequest 객체의 setAttribute( ) 메서드를 이용해 속성을 바인딩 한다.

 

// GetAttribute.java
package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class GetAttribute
 */
@WebServlet("/GetAttribute")
public class GetAttribute extends HttpServlet {       
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	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 sess = request.getSession();
		// 각 서블릿 API에서 바인딩 된 속성의 값을 가져옴
		String ctxMesg = (String) ctx.getAttribute("context");
		String sesMesg = (String) sess.getAttribute("session");
		String reqMesg = (String) request.getAttribute("request");
		
		out.print("context값 : " + ctxMesg + "<br>");
		out.print("session값 : " + sesMesg + "<br>");
		out.print("request값 : " + reqMesg + "<br>");
	}
}

브라우저에서 /set으로 요청해 속성을 바인딩한다.

/set으로 요청 시 출력 결과

Context와 Session 객체에 바인딩 된 속성은 같은 브라우저에서 접근할 수 있어서 값을 출력하지만, 기존에 바인딩 된 request 객체는 /get으로 요청하여 생성된 request 객체와 다르기때문에 null이 출력된다.

 

같은 브라우저에서 /get으로 요청 시 출력 결과는 앞의 요청과 다르므로 바인딩 된 속성이 유지되지 않음


아래와 같이 인터넷 익스플로러에서 /get으로 요청하면 크롬의 세션 객체에는 접근할 수 없어 null을 출력하지만,

Context 객체에 바인딩 된 데이터는 모든 브라우저에서 같은 결과를 출력한다.

다른 브라우저에서 요청한 것이기 때문에 세션이 다르므로 속성이 유지되지 않음

728x90