웹 서버
- 웹 페이지를 사용자에게 전송하는 서버
- 웹 서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용한다.
사용자는 브라우저에 URL 주소를 입력하고,
웹 서버는 웹 페이지를 사용자에게 전송하고,
사용자는 웹페이지를 얻게 된다.
서블릿 컨테이너(Servlet Container)
- 서블릿을 관리해주는 것 (서블릿 생성(init()), 실행(service()), 파괴(destroy()))
- 서블릿이 클라이언트의 요청을 받아 응답할 수 있도록 웹 서버와 소켓을 만들어 통신
- 클라이언트는 일반적으로 서버에서 정적인 웹페이지만 요청 가능함.
- 서블릿 컨테이너는 클라이언트의 요청에 기반한 동적인 웹페이지를 제공하지 위해 서버에서 실행되는 프로그램를 사용하는 것.
- 따라서, 웹서버와 서블릿들이 상호작용할 때 서블릿 컨테이너는 필수적임
- ex. Tomcat

[브라우저] --요청--> [웹서버]
└── 정적 자원만 응답 가능 (HTML, CSS 등)
[브라우저] --요청--> [웹서버] + [서블릿 컨테이너]
└── 자바 코드 실행해서 동적 HTML 생성
- 서블릿 외에도 JSP(JavaServer Pages)라는 기술이 있음
- JSP는 HTML에 자바 코드를 섞어 동적인 페이지를 쉽게 만들 수 있도록 도와줌
- JSP는 처음 요청 시 서블릿(Java 코드)으로 변환되고, 이후 서블릿처럼 실행됨
- 즉, JSP도 서블릿 컨테이너에 의해 실행되며, 주로 사용자에게 보여줄 HTML 화면(View)을 구성할 때 사용

HTTP 요청/응답 흐름
- 사용자(클라이언트)가 URL을 클릭 -> HTTP 요청을 Servlet Container로 전송
- 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성
- web.xml은 사용자가 요청한 URL을 분석하여 어느 서블릿에 대해 요청을 한 것인지 find
- 해당 서블릿에서 service 메소드를 호출한 후 클라이언트의 POST, GET여부에 따라 doGet() 또는 doPost()를 호출합니다.
- doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 전송
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.
서블릿 생명주기
- 생성 - init()
- 클라이언트가 처음 요청을 보낼 때, 서블릿이 메모리에 로드되지 않았다면, 서블릿 컨테이너가 서블릿 객체를 딱 1번 생성하고, init() 메소드를 호출
- 서블릿 초기화 작업을 담당
- 실행(요청 처리) - service()
- 생성된 서블릿 객체는 요청이 들어올 때마다 service() 메소드가 호출됨
- 요청 방식(GET, POST, DELETE... 등)에 따라 doGet(), doPost(), doDelete() 등을 호출
- 여러 사용자의 요청에도 동일한 서블릿 객체가 재사용됨 (서블릿 객체는 싱글톤으로 관리)
- 소멸 - destroy()
- 서버가 종료되거나 서블릿이 더 이상 필요 없을 때, 서블릿 컨테이너는 destroy() 메소드를 호출해서 자원 해제 등의 정리 작업을 수행