
웹 애플리케이션에서는 요청이나 사용자, 애플리케이션 전체에 걸쳐 데이터를 저장하고 관리해야 하는 경우가 많습니다.
이런 데이터들은 저장되는 범위(Scope)에 따라 적절한 객체에 담아야 하며, 자바 서블릿에서는 이를 위해 세 가지 주요 객체를 제공합니다.
Scope란?
웹 애플리케이션에서 데이터를 저장할 수 있는 범위(scope)를 의미합니다.
Scope에 따라 데이터가 저장되는 위치와 지속 시간(생명주기)가 달라집니다.
이 글에서는 각각의 객체가 어떤 범위를 가지는지, 언제 생성되고 사라지는지, 어떤 상황에서 어떤 객체를 써야 하는지 정리해보겠습니다.
대표적으로 서비스명, DAO 객체, 공통 설정값, 초기화 파라미터 공유 등에 사용됩니다.
| 생성 시점 | 생명주기 |
|---|---|
| 웹 애플리케이션 배포(서버 시작) | 웹 애플리케이션 종료(서버 중지)까지 (서버 재시작 포함) |
web.xml에 정의된 초기화 파라미터 공유ServletContext context = getServletContext();
context.setAttribute("appName", "MyWebApp");
애플리케이션 이름: ${applicationScope.appName}
applicationScope는 EL(Expression Language) 문법에서 ServletContext 영역을 의미합니다.getServletContext()로 전역 객체를 가져와 값을 저장합니다.${applicationScope.속성명}을 통해 해당 값을 출력할 수 있습니다.public class AppInitListener implements ServletContextListener {
// 애플리케이션이 시작될 때 실행됨
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext(); // 컨텍스트 객체 꺼냄
context.setAttribute("appName", "MyWebApp"); // 전역 속성 등록
}
// 애플리케이션이 종료될 때 실행됨 (필요 없으면 생략 가능)
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 리소스 정리 작업 등 수행 가능
}
}
대표적으로 로그인 상태 유지, 사용자 정보 저장, 장바구니 기능 구현 등에 사용됩니다.
| 생성 시점 | 생명주기 |
|---|---|
사용자가 최초로 request.getSession() 호출 시 | 마지막 요청 후 기본 30분(설정 가능) 또는 session.invalidate() 호출 시까지 |
request.getSession()은 HttpServletRequest 객체에서 세션을 꺼내오는 메서드이며, 세션이 없으면 새로 생성합니다.request.getSession(false)의 false는 “세션이 없으면 새로 만들지 말고 null을 반환하라”는 의미입니다.web.xml이나 코드에서 조정 가능합니다.세션 유효시간 설정 코드 예:
// 세션 유효시간을 10분(600초)으로 설정 HttpSession session = request.getSession(); session.setMaxInactiveInterval(600); // 초 단위 (예: 10분)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 클라이언트에서 보낸 아이디와 비밀번호 받기
String userId = request.getParameter("userId");
String password = request.getParameter("password");
// 2. 간단한 로그인 검증
if ("hong123".equals(userId) && "pass123".equals(password)) {
// 3. 세션 가져오기 (없으면 새로 생성됨)
HttpSession session = request.getSession();
// 4. 세션에 사용자 정보 저장
session.setAttribute("userId", userId);
// 5. 로그인 성공 후 이동
response.sendRedirect("loginSuccess.jsp");
} else {
response.sendRedirect("loginFail.jsp");
}
}
<%@ page session="true" %>
<html>
<head><title>로그인 성공</title></head>
<body>
<h2>로그인 성공!</h2>
<p>환영합니다, <strong>${sessionScope.userId}</strong> 님!</p>
</body>
</html>
${sessionScope.속성명}은 JSP의 EL(Expression Language) 문법입니다.doPost() 메서드에서 세션을 생성하고 사용자 정보를 저장합니다. ${sessionScope.userId}를 통해 해당 사용자의 이름을 출력할 수 있습니다.session.invalidate()web.xml에서 세션 타임아웃 설정 가능<session-config>
<session-timeout>15</session-timeout> <!-- 분 단위 -->
</session-config>
/loginSuccess.jsp;jsessionid=ABC123DEF456HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("userId") == null) {
response.sendRedirect("login.jsp");
}
대표적으로 폼 입력값 처리, 페이지 간 데이터 전달, 요청 속성 설정 등에 쓰입니다.
| 생성 시점 | 생명주기 |
|---|---|
| 사용자가 서버에 요청할 때 | 요청 처리 → 응답 완료 시 소멸 |
request.getParameter("name"))request.setAttribute)forward() 시 데이터 전달<form action="/submit" method="post">
이름: <input type="text" name="username" />
<input type="submit" value="전송" />
</form>
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 요청 파라미터에서 값 꺼내기
String username = request.getParameter("username");
// 2. 처리 결과를 request 범위에 저장
request.setAttribute("result", username + "님, 접수 완료!");
// 3. 결과를 출력할 JSP로 포워딩
request.getRequestDispatcher("result.jsp").forward(request, response);
}
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<h2>요청 결과</h2>
<p>${requestScope.result}</p>
</body>
</html>
${requestScope.속성명}은 JSP의 EL(Expression Language) 문법입니다.forward()로 전달된 JSP에서는 ${requestScope.속성명}을 통해 해당 값을 출력할 수 있습니다.forward()로 넘기면 데이터 유지 가능redirect()는 새로운 요청이므로 리디렉션 시 소멸됨| 구분 | 저장 범위 | 생명주기 | 데이터 예시 | 대표 메서드 |
|---|---|---|---|---|
| ServletContext | 웹 애플리케이션 전체 | 서버 시작 ~ 종료 | 공통 설정값, DAO | getServletContext() |
| HttpSession | 사용자(브라우저) 단위 | 최초 요청 ~ 세션 만료 | 로그인 정보, 장바구니 | request.getSession() |
| ServletRequest | HTTP 요청 단위 | 요청 시작 ~ 응답 완료 | 폼 입력값, 임시 결과 | request.getParameter(),request.setAttribute() |
ConcurrentHashMap 사용)