서블릿 속성과 스코프
서블릿 속성(Session)이란 다음 세 가지 서블릿 API 클래스에 저장되는 객체(정보)라고 보면 됩니다.
- ServletContext
- HttpSession
- HttpServletRequest
서블릿 API의 setAttribute(String name, Object value)로 바인딩하고, 필요할 때 getAttribute(String name)으로 바인딩된 속성을 가져오면 됩니다. 또한, removeAttribute(String name)을 이용해 속성을 서블릿 API에서 제거할 수도 있습니다.
서블릿의 스코프(scope)는 서블릿 API에 바인딩된 속성에 대한 접근 범위를 의미합니다.
ServletContext에 바인딩된 속성은 애플리케이션 전체에서 접근할 수 있으므로 애플리케이션 스코프를 갖습니다. HttpSession에 바인딩된 속성은 그 HttpSession에 해당하는 브라우저에만 접근할 수 있으므로 세션 스코프를 갖습니다. HttpServletRequestsms 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 갖습니다.
스코프의 가능은 다음과 같습니다.
- 로그인 상태 유지 기능
- 장바구니 기능
- MVC의 Model과 View의 데이터 전달 기능
스코프의 종류와 특징
| 스코프 종류 | 해당 서블릿 API | 속성의 스코프 |
| 애플리케이션 스코프 | ServletContext | 속성은 애플리케이션 전체에 대해 접근할 수 있습니다. |
| 세션 스코프 | HttpSession | 속성은 브라우저에서만 접근할 수 있습니다. |
| 리퀘스트 스코프 | HttpServletRequest | 속성은 해당 요청/응답 사이클에서만 접근할 수 있습니다. |
1. 다음과 같이 GetAttribute, SetAttribute 클래스 파일을 준비합니다.

2. SetAttribute 클래스를 다음과 같이 작성합니다. ServletContext, HttpSession, HttpServletRequest 객체의 SetAttribute() 메서드를 이용해 속성을 바인딩합니다.
package sec01.ex01;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/set")
public class SetServlet 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에 바인딩됩니다.";
ServletContext ctx = getServletContext();
HttpSession session = request.getSession();
ctx.setAttribute("context", ctxMesg);
session.setAttribute("session", sesMesg);
request.setAttribute("request", reqMesg);
out.print("바인딩을 수행합니다.");
}
}
3. 두 번째 서블릿인 GetAttribute 클래스를 다음과 같이 작성합니다. 각 서블릿 API들의 getAttribute() 메서드를 이용해 속성의 이름으로 바인딩한 값을 가져와 브라우저로 출력합니다.
package sec01.ex01;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@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 sess = request.getSession();
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>");
}
}
4. 브라우저에서 /set으로 요청해 속성을 바인딩합니다.

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

6. Microsoft Edge에서 요청했기 때문에 이번에는 크롬의 세션 객체에는 접근할 수 없어 null을 출력합니다. 반면에 Context 객체에 바인딩된 데이터는 모든 브라우저에서 같은 결과를 출력합니다.

'프로그래밍 언어 > 자바 웹' 카테고리의 다른 글
| Filter API (1) | 2025.09.01 |
|---|---|
| 서블릿의 여러 가지 URL 패턴 (0) | 2025.08.29 |
| 세션을 이용한 로그인 예제 (0) | 2025.08.23 |
| encodeURL() 사용법 (0) | 2025.08.20 |
| 세션을 이용한 로그인 정보 바인딩 실습 (4) | 2025.08.17 |