## `Servlet`이란?
**자바 기반 [[1. WAS|WAS]] 개발에서 동적 콘텐츠를 생성할 때 지켜야 하는 표준 규격**. 스레드 풀을 사용하여 클라이언트의 요청을 효율적으로 처리한다는 점(1), 자바 언어 기반이기에 OOP에 적합하고 플랫폼 독립성을 가진다는 점(2), [[0. HTTP#무상태|HTTP의 특징인 무상태]]를 보완할 수 있는 세션 기능을 내장하고 있다는 점(3) 등 여러 장점으로 기존 많이 쓰이던 [CGI](https://en.wikipedia.org/wiki/Common_Gateway_Interface)를 밀어내고 서버 개발의 표준이 되었다. '서버 개발자는 곧 자바 개발자'라는 인식이 생겨난 시발점이다.
## Servlet의 특징
이 글에서는 서블릿을 통한 구체적인 서버 개발 방법보다는 서블릿의 **특징**을 이해하는데 초점을 둘 것이다.
### 인터페이스를 통한 추상화
웹 컨테이너는 특정 서블릿 객체가 아닌 서블릿 인터페이스에 의존한다.( #의존성_역전_원칙 ) 따라서 개발자는 반드시 이 서블릿 인터페이스를 구현하거나 서블릿 구현체를 상속 받아 서블릿 클래스를 구현해야 한다. 아래는 그 예시이다.
#### 서블릿 인터페이스 구현 예시
```java
import javax.servlet.Servlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
public class MyServlet implements Servlet {
public void init() throws ServletException {
// Servlet 초기화 로직
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// 클라이언트 요청 처리 로직
}
public void destroy() {
// Servlet 소멸 로직
}
public String getServletInfo() {
return null;
}
}
```
#### 서블릿 구현체 상속 예시
```java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// GET : .../myfirst 로직
}
}
```
### 멀티 스레드에 적합한 구조
#### 싱글톤을 통한 인스턴스 공유
서블릿 인스턴스는 싱글톤으로 생성된다. 덕분에 멀티 스레드 환경에서 서블릿 인스턴스를 일일이 생성할 필요 없이, 하나의 인스턴스를 공유해서 사용할 수 있다.
#### 스레드에 독립적인 요청 처리
서블릿의 `service` 메서드는 요청-응답 객체의 메모리 값만 받아올 뿐, 해당 객체를 어떤 스레드에서 만들었는지에 대한 정보를 받아오지 않는다. 덕분에 서블릿의 `service` 메서드는 스레드와 무관하게 각 요청을 처리한다.