해당 글에 대한 번역 및 내용은 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을 가져온다.


Posted by doubler
,