HTML은 Form으로 데이터를 전송한다.
POST 방식으로 리소스를 전송할 때 아래와 같은 형식의 회원가입 창이라고 생각하자

<form action="/save" method="post">
<input type="text" name="username" />
<input type="text" name="age" />
<button type="submit">전송</button>
</form>
위와 같이 리소스를 생성하고자 서버에 클라이언트가 요청을 하면
HTTP메시지(요청메시지)가 아래와 같이 생성된다!
POST /save HTTP/1.1
Host: localhost:8080
Content-type: application/x-www-form-urlencoded
username=kim&age=20
서버에서는 위의 텍스트로 된 메시지를 읽는다.
이제 응답메시지가 생기기까지 서버는 무슨일을 하는지 알아보자!
서버에서 처리해야 하는 업무(서블릿을 지원하는 WAS사용)
- 서버 TCP/IP 연결 대기, 소켓 연결(3way hand shake)
- HTTP 요청 메시지를 파싱해서 읽기(텍스트를 모두 읽어야함)
- POST 방식, /save URL 인지
- Content-Type 확인
- HTTP 메시지 바디 내용 피싱
- username, age 데이터를 사용할 수 있게 파싱
- 저장 프로세스 실행
- 비즈니스 로직 실행
- HTTP 응답 메시지 생성 시작
- HTTP 시작 라인 생성
- Header 생성
- 메시지 바디에 HTML 생성에서 입력
- TCP/IP에 응답 전달, 소켓 종료
위의 과정에서 비즈니스 로직은 붉은 글씨로 해둔 것 뿐이다.
비즈니스 로직만 수행하면 되는데 너무 과하게 서버가 사용되고 있는 것이다.
그런 단점을 보완하기 위해 서블릿이 등장했고 서블릿은 붉은 글씨 이외의 모든 업무를 자동화 해준다.
서블릿의 특징

서블릿은 위와 같이 생긴 코드인데 HttpServlet을 상속받고 그 안에서 서비스 로직을 실행시킨다.
매개변수에는 요청값을 주로 받는데 여기서 HTTP응답, 요청 메시지를 편하게 서버와 클라이언트 간에
통신할 수 있도록 두 클래스를 상속받아 사용한다.
- urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServeletRequest
(위의 클래스를 상속받아서 요청메시지를 편하게 파싱할 수 있다.)
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServeletResponse
(위의 클래스를 상속받아서 응답메시지를 편하게 파싱할 수 있다.)
- 개발자는 HTTP 스펙을 매우 편리하게 사용한다.
위의 클래스를 서블릿에서 상속받음으로 인해 개발자는 HTTP의 어려운 로직을 이해할 필요 없이 사용할 수 있으나 개발자라면 어느정도 HTTP에대해서는 인지하고 있어야 한다!
서블릿의 Http요청, 응답 흐름
- HTTP 요청시
- WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다
- 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용한다.
- 개발자는 Response 객체에서 HTTP 응답 정보를 편리하게 입력한다.
- WAS는 Request 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성한다.
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
- 서블릿 객체는 싱글톤으로 관리된다.
- 고객의 요청이 올 때마다 객체가 재생성되는 것은 비효율적이다.
- 최초 로딩 시점에서 서블릿 객체를 미리 만들어두고 재활용한다.
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
- 공유 변수 사용 주의(위의 밑줄 참고, 다른 사람이 내 정보를 보게 될 수 있으므로!)
- 서블릿 컨테이너 종료 시 함께 종료된다.(생명주기에 관한 내용)
- JSP도 서블릿으로 변환 되어서 사용한다.
- 동시 요청을 위한 멀티 쓰레드 처리 지원.
여기까지 서블릿에 대해 알아보았다. 다음은 멀티쓰레드에 대해 알아보도록 하겠다!
출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(인프런, 김영한 강사님)