갓영한님 스프링 MVC 강의를 듣고 정리한 내용들입니다.
Web Server (ex-Apache) 와 Web Application Server (ex-Tomcat) 의 경계는 기준에 따라 모호하지만, 일반적으로 WS는 정적 리소스(이미지, html 등 파일) , WAS는 어플리케이션 로직을 말한다.
그리고 WAS는 WS의 기능을 제공하기 때문에 WAS, DB만 가지고 시스템을 구성할 수 있다. 하지만 효율적인 리소스 관리를 위해 WS + WAS + DB 로 역할을 전담하여 웹 시스템을 구성하게 된다.
웹 브라우저가 생성한 http request message 가 WAS에 왔다고 가정해보자.
이 길고 복잡한 메세지를 파싱 하여 필요한 처리 및 공통 처리를 해주고, 비즈니스 로직을 실행 후 다시 response message 를 생성해서 보내야 하는데, 이 비즈니스 로직 외에 번거롭고 필요한 일들을 해주는 것이 서블릿이다.
HttpServletRequest 와 HttpServletResponse 를 통하여 개발자는 HTTP 스펙을 편리하게 사용할 수 있게 된다.
흐름
http 요청 시
-> WAS는 먼저 Request, Response 객체를 새로 만든 후 서블릿 객체를 호출함.
-> 개발자가 만들어진 Request 객체를 통해 http request 정보를 편리하게 꺼내서 사용함.
-> 개발자가 Response 객체에다가 http response 정보를 편리하게 입력함.
-> WAS는 Response 객체에 담겨있는 내용으로 http 응답 정보를 생성함.
톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
WAS에는 여러 개의 컨테이너가 존재할 수 있다.
각 컨테이너는 자신이 생성한 서블릿 객체들의 생명주기까지 모두 싱글톤으로 관리한다.(Servlet 객체를 자동으로 생성하고, 초기화 및 호출 종료까지 관리)
왜 싱글톤일까?
고객마다 request/response 해줄 내용들은 당연히 다 다르다.
그래서 Request, Response 객체는 항상 새로 생성되는게 맞음.
근데 애플리케이션 로직이 들어있는 서블릿 컨테이너 속의 서블릿 객체는 모두에게 공통적이기 때문에 싱글톤으로 관리하는 것이 효율적이다.