> For the complete documentation index, see [llms.txt](https://dodeon.gitbook.io/study/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dodeon.gitbook.io/study/kimyounghan-spring-mvc/01-web-application/servlet.md).

# 서블릿

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Fef014ee70d64f7237af6591cfd5024622064d798.png?generation=1622975570650086\&alt=media)

HTML form으로 post 전송을 요청하면 웹 브라우저가 오른쪽처럼 HTTP 메시지를 만든다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Ffca20e9a3c6fd687eb539529b3151af058bf8627.png?generation=1622975571052356\&alt=media)

만약 웹 애플리케이션 서버를 직접 다 만들어야 한다면 HTTP 메시지를 모두 풀어헤쳐야 한다. 그 다음엔 왼쪽과 같은 과정을 거친다.

이 많은 과정 중에 초록색으로 표시한 부분이 의미있는 비즈니스 로직이다. 그런데 그 전후 처리가 너무 많다. 개발자들이 이걸 개발하는 것은 비효율적이다.

서블릿은 초록색을 제외한 모든 일을 지원해준다. 주로 서블릿을 지원하는 WAS들이 이 기능을 제공한다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2F3c5108326008c9f03f97c9f9bff87e9ae794c18e.png?generation=1622975571465979\&alt=media)

서블릿은 위와 같이 생겼다. URL이 호출되면 해당 코드가 실행된다. 이 코드에 애플리케이션 로직만 작성하면 되는 것이다.

* HttpServletRequest
  * HTTP 요청 정보를 편리하게 사용하도록 한다.
* HttpServletResponse
  * HTTP 응답 정보를 편리하게 제공한다.

서블릿 덕분에 개발자는 HTTP 스펙을 편리하게 사용할 수 있다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Fd1e15b9965fb11cbd0e0aca139ce344598af5f47.png?generation=1622975571288013\&alt=media)

1. 브라우저가 `/hello`로 요청을 보내면 WAS는 이 요청 메시지를 기반으로 request, response 객체를 생성한다.
   * 개발자는 request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용한다.
2. 두 객체를 넘겨받은 서블릿 컨테이너는 개발자가 만든 helloServlet을 실행해준다.
3. 리턴을 하면 reponse 객체에 응답 메시지를 만들어 브라우저에 전달한다.
   * 개발자는 response 객체에 HTTP 응답 정보를 편리하게 입력한다.
   * WAS는 response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성한다.

## 서블릿 컨테이너

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Ff98e95cb4b8812f95fb54bc6c6ec47085c2fdf2b.png?generation=1622975570930716\&alt=media)

* 톰캣처럼 서블릿을 지원하는 WAS는 서블릿 컨테이너라고 한다.
* 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
* 서블릿 객체는 싱글턴으로 관리한다.
  * 요청할 때마다 객체를 생성하는 것은 비효율적이다.
    * request, response는 요청마다 데이터가 다르므로 요청마다 새로 만든다.
  * 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.
    * 메서드 안에 애플리케이션 로직만 만들면 되므로 항상 재사용한다.
  * 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
    * 같은 서버라면 누가 요청하든 같은 서블릿 인스턴스로 로직을 실행한다.
    * 따라서 공유 변수를 사용할 때 조심해야 한다. 자칫하면 다른 사람이 로그인했는데 내 정보가 보일 수 있다.
  * 서블릿 컨테이너가 종료될 때 함께 종료된다.
* JSP도 서블릿 변환되어서 사용한다.
* 동시 요청을 위한 멀티 스레드 처리를 지원한다.
