서블릿 관련된 포스팅이 있어서 공부 후 기록했다.
ServletContext 의 생성 및 Session의 클라이언트와 서버간 동작 방식과 소멸 등에 대한 내용을 담고있다.
ServletContext
서블릿 컨테이너(아파치 톰캣과 같은)가 시작되면, 해당 서블릿 컨테이너는 모든 웹 어플리케이션들을 배포하고 로드(load)합니다.
웹 어플이케이션이 로드되면 서블릿 컨테이너는 ServletContext를 한번 생성하여, 서버의 메모리에 보관합니다.
(각 웹 애플리케이션에 대해 서블릿 컨테이너는 해당 애플리케이션의 설정 파일인 web.xml 또는 애너테이션 기반 설정을 읽고 초기화 작업을 수행.)
- 애플리케이션 시작 시 생성:
- 웹 애플리케이션이 처음 로드되고 초기화될 때 서블릿 컨테이너가 ServletContext 객체를 생성합니다.
- 이 객체는 웹 애플리케이션이 종료되거나 서블릿 컨테이너가 중지될 때까지 유지됩니다.
- 애플리케이션 내에서 공유:
- ServletContext는 애플리케이션 내 모든 서블릿, JSP, 필터, 리스너 등이 공유하여 사용할 수 있습니다.
- 각 요청(request)이나 세션(session)처럼 사용자별로 개별 객체가 생성되지 않고, 모든 사용자가 동일한 ServletContext를 참조합니다.
- 글로벌 설정 및 리소스 관리:
- 데이터베이스 연결 풀, 애플리케이션 설정 정보, 전역 상태 등을 저장하고 공유하는 데 사용됩니다.
- 이는 전역 데이터를 관리하는데 효율적이지만, 올바르게 사용하지 않으면 동시성 문제를 초래할 수 있습니다.
- 다중 사용자 환경에서의 동작:
- 여러 사용자가 동시에 애플리케이션에 요청을 보내더라도, 각 요청은 별도의 스레드로 처리됩니다.
- 모든 스레드는 동일한 ServletContext 객체에 접근하며, 이 객체는 메모리에 단일 인스턴스로 유지됩니다.
서블릿 컨테이너가 종료되면
ServletContext는 웹 애플리케이션의 라이프사이클 동안 유효합니다.
모든 웹 어플리케이션들을 언로드(unload)하고, 모든 초기화된 서블릿 및 필터의 destory() 메소드를 실행후 ServletContext, Servlet, Filter 및 Listener 인스턴스들은 전부 삭제됩니다.
서버가 클라이언트의 요청을 받았을 때 HttpSession
서버 측 코드(사용자가 작성한 코드)가 HttpServletRequest#getSession()을 통해 HttpSession을 얻으려고 시도하지만 아직 생성된 세션이 없는 경우(새 세션에서의 첫 요청), 서버는 자동으로 새로운 세션을 생성합니다. 서버는 긴, 고유하며 예측하기 어려운 ID를 생성(이는 HttpSession#getId()를 통해 가져올 수 있음)하고, 이 ID를 JSESSIONID 라는 이름의 쿠키 값으로 설정합니다. 내부적으로는 HttpServletResponse#addCookie()를 사용하여 쿠키를 설정합니다. 이후 서버는 모든 세션을 세션 ID를 키로, HttpSession을 값으로 하는 일종의 맵(Map)에 저장합니다
서블릿 컨테이너는 들어오는 모든 HTTP request의 cookie header에서 JSESSIONID라는 이름의 cookie가 있는지 확인하고 해당 값 (session ID)을 사용하여 서버의 메모리에 저장된 HttpSession을 가져옵니다.
HttpSession 의 종료는
web.xml의 설정인 <session-timeout>에 지정된 값 까지만 살아있습니다.
기본값은 30분입니다. 따라서 클라이언트가 time out보다 오래 웹 어플리케이션을 방문하지 않으면 서블릿 컨테이너가 session을 삭제합니다.
=> 세션 만료 시 서버가 HttpSessionListener의 sessionDestroyed() 메서드를 호출하여 세션 정리를 수행
명시적으로 세션을 종료하기 위해서는
사용자의 코드 내에서 HttpSession#invalidate()를 호출하면 됩니다.
https://stackoverflow.com/questions/1700390/best-option-for-session-management-in-java
Best option for Session management in Java
Best way managing session in Java. I heard that cookies are not reliable option for this as they gets stored into browser and can be accessed later on? Is this correct? If possible please come up w...
stackoverflow.com
https://jojoldu.tistory.com/118
서블릿의 인스턴스화, session, 멀티스레딩에 관련된 질문과 답변에 대한 번역
스택오버플로우에 올라온 서블릿과 관련된 질문에 아주 좋은 답변이 달린 것을 보고 이건 많은 분들이 보시면 좋겠다는 생각에 첫 번역을 시작하게 되었습니다. 영어를 너무 너무 못하지만 그
jojoldu.tistory.com
'BackEnd > JAVA' 카테고리의 다른 글
[JAVA] Thread pool 을 위한 ExecutorService 의 생성과 submit, shutdown (0) | 2024.11.13 |
---|---|
[JAVA] Calendar 클래스 / 오늘 날짜 구하기 / 이번 달의 첫번째 날 / 이번 달의 마지막 날 / 현재로부터 과거까지 역순 데이트 리스트 출력 (0) | 2023.05.10 |
[JAVA] POJO (Plain Old Java Object) (0) | 2023.03.07 |
[JAVA] 콤마로 구분되어 저장된 String 데이터 List화 하기 (0) | 2023.02.21 |
[JAVA] 클래스(class)와 생성자 (1) | 2023.01.14 |