해당 글에 대한 번역 및 내용은 http://jojoldu.tistory.com/118 에서 들고왔음을 밝힙니다. 자세한 내용은 해당 글을 참고하시면 됩니다.
서블릿이 어떻게 동작하는지에 대해서 질문이 스택오버플로우에 올라왔다.
Question
클라이언트가 단일인 경우, 혹은 다중인 경우 세션변수는 어떻게 관리되는지.
세션변수는 모든 클라이언트에게 공유되는지 혹은 개별적인지.
서블릿의 인스턴스화는 딱 한번 실시되는지 여러 번 실시되는지.
답변을 보기 이전에, 서블릿에 대한 사전 내용을 살펴보자.
Servlet 이란.
- Servlet은 웹에서 자바 프로그래밍을 가능하게 하기 위해 등장
- 자바로 구현된 CGI(Common Gateway Interface)라고 이야기 한다.
- Http Protocol 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속하여 개발, Servlet은 Container에 의해서 실행되고 관리된다.
Servlet Container 란.
- http 요청을 받아서 servlet을 실행시키고, 그 결과를 사용자에게 전달해주는 기능을 제공하는 컴포넌트
- Servlet과 웹서버가 서버 통신할 수 있는 방법을 제공
- 멀티 스레딩을 지원하여 클라이언트의 다중 요청을 알아서 처리
- 대표적인 Container 는 Tomcat, jetty, jboss 등이 존재
Answer
ServletContext
- 서블릿 컨테이너가 시작된다면 해당 서블릿 컨테이너는 모든 웹 애플리케이션들을 배포하고 로드한다.
- 웹 애플리케이션이 로드되면, 서블릿 컨테이너는 ServletContext를 단 한번 생성하며, 서버의 메모리에 보관한다.
- 이후 web.xml을 파싱하여 <servlet>, <filter>, <listener> 가 발견되면 해당 클래스들을 한번 인스턴스 생성하고 서버의 메모리에 보관한다.
- 서블릿 컨테이너가 종료되면 모든 웹 애플리케이션들은 언로드되며, 모든 초기화된 서블릿 및 필터들은 destroy() 메소드를 실행한 이후 생성한 인스턴스들은 전부 삭제된다.
- HttpServletRequest & HttpServletResponse
- 서블릿 컨테이너는 특정 포트 번호에서 Http request를 받는 리스너(listens) 웹 서버에 연결된다. (8080포트는 일반적으로 개발단계에서 사용되고 프로덕션, 실제서버 환경에서는 80포트가 사용된다.)
- 클라이언트(웹 브라우저)가 http request를 보낼 때, 서블릿 컨테이너는 새로운 HttpServletRequest와 HttpServletResponse 인스턴스를 생성하고 해당 인스턴스를 미리 정의된 필터 체인과 서블릿 인스턴스를 통과하도록 한다.
- request 객체는 header와 body 같은 http request에 대한 모든 정보를 갖고 있다. response 객체는 예를 들어 header와 body를 설정하는 것처럼 우리가 원하는 방식으로 http 응답을 보낼 수 있다.
- http 응답이 완료되면 request 객체와 response 객체는 재활용되어 재 사용할 수 있다.
- HttpSession
- 클라이언트가 처음으로 웹 애플리케이션을 방문하였을 경우, request.getSession()을 통해서 httpSession을 처음으로 가져오면 서블릿 컨테이너는 새로운 HttpSession 객체를 생성한다. 이를 서버 측 메모리에 저장한다. (세션)
- 서블릿 컨테이너는 JSESSIONID란 이름의 key 그리고 SESSIONID 를 value 로 키/밸류 쌍으로 HTTP 응답 헤더에 Set-Cookie 라는 cookie로 설정한다.
- 서블릿 컨테이너는 들어오는 모든 HTTP request의 cookie header에 JSESSIONID 라는 이름의 쿠키의 존재여부를 확인하고 해당 밸류 값을 이용하여 서버의 메모리에 저장된 HttpSession을 가져온다.
'jvm lang' 카테고리의 다른 글
20180503 콜백 메소드에 대해서 (0) | 2018.05.03 |
---|---|
20180412 자바 CMD로 실행 (0) | 2018.04.12 |
20180403 Java Variable Types (수정 : 20190630) (0) | 2018.04.03 |
20180331 JVM Memory Model ( Garbage Collector : GC ) (0) | 2018.03.31 |
20180328 NewsCrawler Implements in Java (0) | 2018.03.28 |