클라이언트의 요청(request)을 받고 이를 처리해 응답(response)을 보내주는 서블릿 클래스를 구현한 자바 웹 프로그래밍 기술이다.
servlet에는 몇 가지 설계 규약이 존재한다.
클라이언트가 서블릿의 url로 요청을 보내면 톰캣이 이를 해석해 매핑된 서블릿으로 연결하는 구조

✅ web.xml로 등록하면 mapping 정보를 한눈에 확인하고 관리할 수 있다. 하지만, 새로운 서블릿을 추가할 때마다 파일을 이동해서 mapping 정보를 등록하고 일일이 확인해야 한다.
<!-- Servlet 등록 -->
<servlet>
<!-- xmlmapping 라는 이름을 가지는, 실제 클래스의 경로 -->
<servlet-name>xmlmapping</servlet-name>
<servlet-class>com.section01.xml.LifeCycleTestServlet</servlet-class>
<!-- 초기화 되는 순서 지정지정 -->
<load-on-startup>100</load-on-startup>
</servlet>
<!-- 어떤 요청이 들어오면 어떻게 해야 하는가? -->
<servlet-mapping>
<!-- /xml-lifecycle이라는 url 요청이 들어오면, xmlmapping을 실행해주세요!-->
<servlet-name>xmlmapping</servlet-name>
<url-pattern>/xml-lifecycle</url-pattern>
</servlet-mapping>
✅ @annotation으로 등록하는 것이 xml을 이용해 등록하는 것보다 더 간결하기 때문에 이 방법을 선호한다. 다만, @annotation으로 관리하는 경우 통합 관리가 안된다는 단점이 있다.
@WebServlet(value = "/annotation-lifecycle", loadOnStartup = 1)
public class LifeCycleTestServlet extends HttpServlet {
(Servlet code)
}

🔎 동작 흐름 살펴보기
🤔 Servlet Container란?

init() : 서블릿 컨테이너에 의해서 호출되는 메소드로 최초 요청 시에만 실행하고 2번째 요청부터는 호출되지 않는다.
service() : 서블릿 컨테이너에 의해서 호출되며, 최초 요청 시에는 init()이후에 작동하고 그 이후부터는 init() 호출 없이 작동한다.
destory() : 컨테이너가 종료 될 때나 서블릿의 내용이 변경되어 재컴파일 될 때 호출되는 메소드로, 주로 자원을 반납하는 용도로 사용한다.
초기화 : init()
작업 수행 : doGet(), doPost()
종료 : destory()