## `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` 메서드는 스레드와 무관하게 각 요청을 처리한다.