둘 다 메모리에 key-value 속성 저장이 가능하지만 범위
, 수명
, 공유
대상이 다르다.
구분 | application(ServletContext) | session(HttpSession) |
---|---|---|
범위(Scope) | 웹앱 전체(전역) | 사용자 (브라우저) 1명 |
생성 | 앱 시작 | 사용자 최초 접속 |
수명 | 앱 시작-종료 (재배포/재시작 시 초기화) | 세션 생성-만료 (기본 30분 유휴 시 만료) |
공유 대상 | 모든 서블릿 / 필터 / JSP | 같은 사용자의 모든 요청/탭 |
사용 예 | 전역 설정값 , 공용 캐시 핸들 , 레지스트리 | 로그인 정보 , 장바구니 , 개인 설정 |
스레드 | 다수 스레드 종시 접근 (전역) 👉 동시성 주의 | 동일 사용자라도 탭/동시요청으로 경합 가능 |
크기/부하 | 전 사용자 공용이므로 과도하면 전반 영향 | 사용자 수 * 세션 크기 👉 메모리/복제 비용 커짐 |
클러스터 | 노드 간 자동 공유 아님(보통) | 컨테이너 설정으로 세션 복제 가능 |
저장 위치 | 서버 메모리(전역) , 영속❌ | 서버 메모리(사용자별) , 영속❌ |
대표 API | getServletContext() / application.getAttribute() | request.getSession() / session.getAttribute() |
// Servlet
@Override
public void init() {
getServletContext().setAttribute("cdnBaseUrl", "https://cdn.example.com");
}
// JSP
CDN: ${applicationScope.cdnBaseUrl}
// Servlet (로그인 성공 시)
request.getSession().setAttribute("loginUser", userDto);
<!-- JSP -->
<c:if test="${not empty sessionScope.loginUser}">
안녕하세요, ${sessionScope.loginUser.name}님
</c:if>
request.setAttribute(...)
👉 forward
(페이지 바인딩용)session
application
동시성
application
에 넣는 가변 객체는 ConcurrentHashMap
, Atomic*
등으로 스레드 안전하게session
도 같은 사용자가 여러 탭에서 동시에 호출할 수 있어 경합 가능용량 관리
만료/타임아웃
web.xml
또는 설정으로 조정 필요 시 session.invalidate()
로 명시 종료클러스터링
application
전역 공유가 노드 간 자동 동기화 되는 건 아님 👉 외부 스토어(예 : Redis) 고려보안
JSESSIONID
는 쿠키(또는 URL 재작성)로 식별됨 - HTTPS , HttpOnly 설정 확인메서드 | 설명 |
---|---|
setAttribute(name, value) | 앱 전역 키에 객체 저장(기존 값이면 교체) |
getAttribute(name) | 전역 키로 객체 조회 |
removeAttribute(name) | 전역 키 제거 |
getAttributeNames() | 전역 저장소의 키 나열 |
getInitParameter(name) | web.xml 의 <context-param> 값 읽기 |
getContextPath() | 애플리케이션 컨텍스트 경로(/myapp ) |
getResourceAsStream(path) | 리소스를 읽기용 InputStream 으로 획득 |
getRequestDispatcher(path) | 내부 forward/include 용 디스패처 반환 |
getMimeType(file) | 파일명으로 MIME 타입 추정 |
log(msg) | 컨테이너 로그에 메시지 기록 |
전체 메서드 목록 공식 문서 참고: ServletContext Javadoc (Jakarta 6.0). jakarta.ee
(참고: javax Servlet 4.0 Javadoc도 필요 시 확인) Javadoc
메서드 | 설명 |
---|---|
setAttribute(name, value) | 사용자 세션에 값 저장 |
getAttribute(name) | 세션 값 조회 |
removeAttribute(name) | 세션 값 제거 |
getAttributeNames() | 세션 키 나열 |
getId() | 현재 세션 ID 반환 |
isNew() | 이번 요청에서 막 생성된 세션인지 |
getCreationTime() | 세션 생성 시각(ms) |
getLastAccessedTime() | 마지막 접근 시각(ms) |
setMaxInactiveInterval(seconds) | 유휴 타임아웃(초) 설정 |
invalidate() | 세션 무효화(로그아웃 등) |
전체 메서드 목록 공식 문서: HttpSession Javadoc (Jakarta 6.0). jakarta.ee
(참고: javax Servlet 4.0/EE7 Javadoc도 필요 시 확인) Oracle Docs