Java : ServletContext, HttpSession 차이

NuyHes·2025년 8월 12일
0

[Study]

목록 보기
65/71
post-thumbnail

🕵️ ServletContext vs HttpSession 차이

  • ServletContext application 객체 : 애플리케이션 전역 공유 저장소
  • HttpSession session 객체 : 사용자(브라우저)별 개별 저장소

둘 다 메모리에 key-value 속성 저장이 가능하지만 범위 , 수명 , 공유 대상이 다르다.


👀한눈에 비교해보기

구분application(ServletContext)session(HttpSession)
범위(Scope)웹앱 전체(전역)사용자 (브라우저) 1명
생성앱 시작사용자 최초 접속
수명앱 시작-종료 (재배포/재시작 시 초기화)세션 생성-만료 (기본 30분 유휴 시 만료)
공유 대상모든 서블릿 / 필터 / JSP같은 사용자의 모든 요청/탭
사용 예전역 설정값 , 공용 캐시 핸들 , 레지스트리로그인 정보 , 장바구니 , 개인 설정
스레드다수 스레드 종시 접근 (전역) 👉 동시성 주의동일 사용자라도 탭/동시요청으로 경합 가능
크기/부하전 사용자 공용이므로 과도하면 전반 영향사용자 수 * 세션 크기 👉 메모리/복제 비용 커짐
클러스터노드 간 자동 공유 아님(보통)컨테이너 설정으로 세션 복제 가능
저장 위치서버 메모리(전역) , 영속❌서버 메모리(사용자별) , 영속❌
대표 APIgetServletContext() / application.getAttribute()request.getSession() / session.getAttribute()

기본 예시

application 전역 값

// Servlet
@Override
public void init() {
  getServletContext().setAttribute("cdnBaseUrl", "https://cdn.example.com");
}

// JSP
CDN: ${applicationScope.cdnBaseUrl}

session 사용자별 값

// Servlet (로그인 성공 시)
request.getSession().setAttribute("loginUser", userDto);
<!-- JSP -->
<c:if test="${not empty sessionScope.loginUser}">
  안녕하세요, ${sessionScope.loginUser.name}님
</c:if>

🕵️ 실무 가이드 - 언제 무엇을 쓰나

  • 요청 1회 렌더용 데이터 : request.setAttribute(...) 👉 forward (페이지 바인딩용)
  • 사용자별 상태(로그인 , 장바구니 , 일시 설정) : session
  • 앱 전역 설정/공용 리소스 핸들(예 : 캐시매니저 , 읽기 전용 설정 값) : application

⚠️ 주의할 점

동시성

  • application에 넣는 가변 객체는 ConcurrentHashMap , Atomic* 등으로 스레드 안전하게
  • session도 같은 사용자가 여러 탭에서 동시에 호출할 수 있어 경합 가능

용량 관리

  • 세션에 큰 객체(대형 리스트 , 이미지 바이트 등) 넣지 말 것 (메모리 폭증 , 세션복제 비용🆙)
  • 전역(application)에도 캐시 남발 금지 - 메모리/재배포 이슈

만료/타임아웃

  • 세션 기본 타임아웃은 web.xml 또는 설정으로 조정 필요 시 session.invalidate()로 명시 종료

클러스터링

  • 세션 복제 사용 시 세션 속성은 직렬화 가능해야 함
  • application 전역 공유가 노드 간 자동 동기화 되는 건 아님 👉 외부 스토어(예 : Redis) 고려

보안

  • 민감정보는 세션에도 최소한만 저장(토큰 , 식별자 등)
  • JSESSIONID는 쿠키(또는 URL 재작성)로 식별됨 - HTTPS , HttpOnly 설정 확인

메서드 요약

ServletContext (application)

메서드설명
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

HttpSession (session)

메서드설명
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


0개의 댓글