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

hoonak·2023년 8월 23일
0

서블릿

목록 보기
14/16

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

  • ServletContext
  • HttpSession
  • HttpServletRequest

각 장은 앞 장에서 이미 사용해 봤음. 서블릿의 API의 setAttribute(String name, Object value)로 바인딩하고, 필요할 때 getAttrubute(String name)으로 바인딩된 속성을 가져오면 됨. 또한 removeAttribute(String name)을 이용해 속성을 서블릿 API에서 제거할 수도 있음.

서블릿의 스코프(scope) 는 서블릿 API에 바인딩된 속성에 대한 접근 범위를 의미함. 앞 장에서도 사용해 봤듯이 ServletContext에 바인딩된 속성은 애플리케이션 전체에서 접근할 수 있으므로 애플리케이션 스코프를 갖음.

HttpSession에 바인딩된 속성은 그 HttpSession에 해당하는 브라우저에게만 접근할 수 있으므로 세션 스코프를 갖음.

HttpServletRequest는 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 갖음.

스코프의 기능은 다음과 같음.

  • 로그인 상태 유지 기능.
  • 장바구니 기능.
  • MVC의 Model과 View의 데이터 전달 기능.
  1. 애플리케이션 스코프 : ServletContext - 속성은 애플리케이션 전체에 대해 접근할 수 있음.

  2. 세션 스코프 : HttpSession - 속성은 브라우저에서만 접근할 수 있음.

  3. 리퀘스트 스코프 : HttpServletRequest - 속성은 해당 요청/응답 사이클에서만 접근할 수 있음.

예 ) 각 서블릿 API에 바인딩된 속성의 스코프를 알아보겠음.

  • SetAttribute.java

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

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;

@WebServlet("/SetAttribute")
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 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("바인딩을 수행합니다.");
	}

}
  • GetAttribute.java

각 서블릿 API들의 getAttribute 메서드를 이용해 속성 이름으로 바인딩한 값을 가져와 브라우저로 출력함.

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;

@WebServlet("/get")
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();
		
		// 각 서블릿 API에서 바인딩된 속성의 값을 가져옴.
		String ctxMesg = (String)ctx.getAttribute("context");
		String sesMesg = (String)session.getAttribute("session");
		String reqMesg = (String)request.getAttribute("request");
		
		out.print("context 값 : " + ctxMesg + "<br>");
		out.print("session 값 : " + sesMesg + "<br>");
		out.print("request 값 : " + reqMesg + "<br>");
	}


}

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

  1. Context와 Session 객체에 바인딩된 속성은 같은 브라우저에서 접근할 수 있으므로 값을 출력함. 그러나 기존에 바인딩된 request 객체는 /get으로 생성된 request 객체와 다르므로 null이 출력됨.
    request 값 -> 앞의 요청과 다르므로 바인딩된 속성이 유지되지 않음.

  1. 인터넷 익스플로러에서 /get으로 요청. 익스플로러에서 요청했기 때문에 이번에 크롬의 세션 객체에는 접근할 수 없어 null을 출력함. 반면에 Context 객체에 바인딩된 데이터는 모든 브라우저에서 같은 결과를 출력함.
    session -> 다른 브라우저에서 요청한 것이라 세션이 다르므로 속성이 유지되지 않음.
profile
Hello World!

0개의 댓글